数据结构(顺序表)

顺序表还原

/*顺序表还原*/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct {
	datatype a[MAXSIZE];
	int size;
}sequence_list;

void init(sequence_list *slt) {		//顺序表置空
	slt->size = 0;
}
void uninit(sequence_list *slt) {		//默认顺序表
	slt->size = 3;
	slt->a[0] = 12;
	slt->a[1] = 5;
	slt->a[2] = 232;
}
void append(sequence_list *slt, datatype x) {		//顺序表后插
	if (slt->size == MAXSIZE) {
		printf("顺序表是满的!\n");
		exit(1);
	}
	slt->a[slt->size] = x;
	++slt->size;
}

void display(sequence_list slt) {		//打印顺序表各节点值
	if (!slt.size)
		printf("顺序表是空的!\n");
	else
		for (int i = 0; i < slt.size; ++i) {
			printf("%5d",slt.a[i]);
		}
}

int empty(sequence_list slt) {		//判断顺序表是否为空
	printf("顺序表为空!\n");
	return(slt.size == 0 ? 1 : 0);
}

int find(sequence_list slt, datatype x) {		//查找节点位置
	int i = 0;
	while (i < slt.size&&slt.a[i] != x)
		++i;
	return (i < slt.size ? i : -1);
}

datatype get(sequence_list slt, int i) {		//取得对应节点的值
	if (i<0 || i>slt.size) {
		printf("指定位置节点不存在!\n");
		exit(1);
	}
	else
		return slt.a[i];
}

void insert(sequence_list *slt,datatype x,int position){		//任意位置插入节点值
	if (slt->size == MAXSIZE) {
		printf("顺序表是满的,无法插入!\n");
		exit(1);
	}
	if (position<0 || position>slt->size) {
		printf("指定位置不存在,无法插入!\n");
		exit(1);
	}
	for (int i = slt->size; i > position; --i)
		slt->a[i] = slt->a[i - 1];
	slt->a[position] = x;
	++slt->size;
}
void dele(sequence_list *slt, int position) {		//删除指定位置节点
	if (slt->size == 0) {
		printf("顺序表是空的!");
		exit(1);
	}
	if (position < 0 || position >= slt->size) {
		printf("指定的删除位置不存在!");
		exit(1);
	}
	for (int i = position; i < slt->size - 1; ++i)
		slt->a[i] = slt->a[i + 1];
	--slt->size;
}
int main()
{
	sequence_list slt;
	init(&slt);
	while (true) {
		printf("\n----------------------------------------------------------------------------------------------------------------------------------------------------------------");
		printf("\n请输入你的选择:1、顺序表置空 2、打印各节点值 3、查找节点位置 4、取得对应节点的值 5、任意位置插入节点值 6、顺序表后插 7、生成默认顺序表(12 5 232) 8、删除指定节点\n");
		int swi;
		scanf("%d", &swi);
		switch (swi) {
		case 0:
			return 0;
		case 1:
			init(&slt);
			printf("顺序表已置空!");
			break;
		case 2:
			display(slt);
			break;
		case 3:
			datatype x;
			printf("请输入要查找的节点:");
			scanf("%d", &x);
			printf("要查找的节点位置为:%d", find(slt, x));
			break;
		case 4:
			int i;
			printf("请输入要查找的节点位置:");
			scanf("%d", &i);
			printf("要查找的节点为:%d", get(slt, i));
			break;
		case 5:
			datatype y, p;
			printf("请输入要插入的数以及位置(用空格分隔):");
			scanf("%d%d", &y, &p);
			insert(&slt, y,p);
			printf("插入完成,显示顺序表如下:\n");
			display(slt);
			break;
		case 6:
			datatype z;
			printf("请输入要插入的数:");
			scanf("%d", &z);
			append(&slt,z);
			printf("后插完成,显示顺序表如下:\n");
			display(slt);
			break;
		case 7:
			printf("生成成功!\n");
			uninit(&slt);
			break;
		case 8:
			int po;
			printf("请输入要删除的节点的位置:");
			scanf("%d", &p);
			dele(&slt, p);
			printf("删除成功!显示顺序表如下:\n");
			display(slt);
			break;
		}
	}
	return 0;
}

顺序表合并以及排序(里边使用了时间函数进行数字随机生成)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct {
	datatype a[MAXSIZE];
	int size;
}sequence_list;

void init(sequence_list *slt) {		//顺序表置空
	slt->size = 0;
}

void display(sequence_list slt) {		//打印顺序表各节点值
	if (!slt.size)
		printf("顺序表是空的!\n");
	else
		for (int i = 0; i < slt.size; ++i) {
			printf("%5d",slt.a[i]);
		}
}

void list(sequence_list *slt) {		//顺序表由小到大排序
	int temp;
	for (int j = slt->size; j > 0; --j) {
		for (int i = 0; i < slt->size - 1; ++i) {
			if (slt->a[i] > slt->a[i + 1]) {
				temp = slt->a[i];
				slt->a[i] = slt->a[i + 1];
				slt->a[i + 1] = temp;
			}
		}
	}
}

int main()
{
	srand((unsigned)time(NULL));
	sequence_list a, b, c;
	int a1, b1, c1;
	init(&a);
	init(&b);
	init(&c);
	printf("请输入a的顺序表节点数:");
	scanf("%d", &a1);
	a.size = a1;
	for (int i = 0; i < a.size; ++i) {
		a.a[i] = rand() % 100;
	}
	printf("自动生成a的顺序表为\n");
	display(a);
	printf("\n-------------------------------------------------------------\n");
	printf("排序后a的顺序表为\n");
	list(&a);
	display(a);
	printf("\n-------------------------------------------------------------\n");
	printf("请输入b的顺序表节点数:");
	scanf("%d", &b1);
	b.size = b1;
	for (int i = 0; i < b.size; ++i) {
		b.a[i] = rand() % 100;
	}
	printf("自动生成b的顺序表为\n");
	display(b);
	printf("\n-------------------------------------------------------------\n");
	printf("排序后b的顺序表为\n");
	list(&b);
	display(b);
	printf("\n---------------------------------------------------------------\n");
	c.size = a.size + b.size;
	for (int i = 0; i < a.size; ++i)
		c.a[i] = a.a[i];
	for (int i = a.size, j = 0; i < c.size; ++i, ++j)
		c.a[i] = b.a[j];
	printf("合并ab后c的顺序表为\n");
	display(c);
	printf("\n---------------------------------------------------------------\n");
	printf("排序后c的顺序表为\n");
	list(&c);
	display(c);
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Automan之鸿鹄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值