【数据结构】1顺序表

//顺序表
typedef struct
{
	elemType data[MAX_SIZE_16];//数据域
	int length;//长度
}tableSeq;

//初始化(逻辑:将顺序表结构体变量的长度元素初始化为0,表示顺序表为空,不初始化C语言中整型变量为随机值)
int init_tableSeq(tableSeq* table)
{
	table->length = 0;//关键代码
	return 1;
}
//清空(逻辑:与初始化函数一致)
int clear_tableSeq(tableSeq* table)
{
	table->length = 0;//关键代码
	return 1;
}
//判断是否为空(逻辑:判断顺序表结构体变量的长度元素是否为0)
int empty_tableSeq(tableSeq* table)
{
	return (table->length==0);//关键代码
}
//表长(逻辑:获取顺序表结构体变量的长度元素值)
int length_tableSeq(tableSeq* table)
{
	return (table->length);//关键代码
}
//销毁(逻辑:释放顺序表结构体变量所在的内存)
int destory_tableSeq(tableSeq* table)
{
	table->length = 0;//关键代码
	return 1;
}
//展示(逻辑:打印从下标为0的元素到下标为length-1的元素)
int show_tableSeq(tableSeq* table)
{
	//printf("%d elements are: ", table->length);
	for (int i = 0; i < table->length; i++)//关键代码
	{
		printf("%d,", table->data[i]);
	}
	printf("\b \n");    // 删除最后一个数字后的分隔符逗号
	return 1;
}
//插入多个元素(逻辑:将一个数组下标对应的赋值给顺序表,最后按给定长度设置顺序表长度)
int create_tableSeq(tableSeq* table, elemType elem[], int length)
{
	//关键代码
	for (int i = 0; i < length; i++)
	{
		table->data[i] = elem[i];
	}
	table->length = length;
	return 1;
}
//插入单个元素(逻辑:判断插入位置是否合理,从数组最后一个元素向插入位置的原始元素遍历来全部后移一个元素,使出现空位,在空位上赋值要插入的数据,顺序表长度加1)order是非0自然数
int insert_tableSeq(tableSeq* table, int order, elemType *elem)
{
	//1、顺序线性表已经满
	if (table->length == MAX_SIZE_16)
	{
		printf("插入失败,顺序线性表已经满!\n");
		return -1;
	}
	//2、当所给序号比第一位置小或者比最后一位置后一位置还要大时
	else if (order <= 0|| order-1 > table->length)
	{
		printf("插入失败,插入位置存在问题!\n");
		return -1;
	}
	//3、插入位置正确
	else if (order > 0 || order <= table->length)
	{
		for (int i = table->length; i >= order - 1; i--)//从下标大的向小的遍历
		{
			table->data[i + 1] = table->data[i];//下标大的获得下标小的值
		}
		table->data[order - 1] = elem;
		table->length++;
		printf("插入成功!\n");
		return 1;
	}
	return -1;
}
//按序删除(逻辑:判断删除位置是否合理,保存要删除的元素值,从删除位置到顺序表最后遍历并前移,顺序表长度减1)
elemType delete_tableSeq(tableSeq* table, int order, elemType elem)
{
	//空
	if (table->length == 0)
	{
		printf("删除失败,线性表为空!");
		return -1;
	}
	//删除位置不正确 
	else if (order <= 0 || order >table->length)
	{
		printf("删除失败,删除位置存在问题!");
		return -1;
	}
	//如果删除不是最后位置 
	else if (order > 0 || order <= table->length)
	{		
		elem = table->data[order - 1];
		for (int i = order; i < table->length; i++)从下标小的向大的遍历
		{
			table->data[i - 1] = table->data[i];//下标小的获得下标大的值	
		}
		table->length--;
		return elem;
	}
	return -1;
}

//按序查值(逻辑:判断查找位置是否合理,依靠数组的随机查找特性直接返回数值)
elemType search_key_tableSeq(tableSeq* table, int order)
{
	if (table->length == 0 || order <=0 || order > table->length)//关键代码
	{
		printf("查找失败,查找位置存在问题!");
		return -1;
	}	
	else
	{
		return table->data[order - 1];
	}
}
//按值查序(逻辑:从顺序表第一个元素到最后一个元素遍历判断是否存在与这个数值相等的位置,返回遍历到的位置)
int search_value_tableSeq(tableSeq* table,elemType elem)
{	
	for (int i = 0; i < table->length+1; i++)//关键代码
	{
		if (table->data[i] == elem)
		{
			return i + 1;
		}
	}
	return -1;
}

//合并(逻辑:将A顺序表的最后一个元素连接B表的第一个元素构成C顺序表)
int merge_table(tableSeq*A, tableSeq*B, tableSeq*C)
{
	elemType * tempArray = (elemType*)malloc(sizeof(elemType) * (A->length+B->length));
	for (int i = 0; i < A->length; i++)
	{
		//printf("%d,", A->data[i]);	
		tempArray[i] = A->data[i];
	}
	for (int i = A->length; i < (A->length + B->length); i++)
	{
		//printf("%d,", B->data[i- A->length]);
		tempArray[i] = B->data[i- A->length];
	}
	for (int i = 0; i < (A->length + B->length); i++)
	{
		C->data[i] = tempArray[i];
	}
	C->length = A->length + B->length;
	free(tempArray);
	return 1;
}

int table_seq()
{
	tableSeq A;
	tableSeq B;
	tableSeq C;

	printf("初始化成功返回1:%d\n",init_tableSeq(&A));
	printf("顺序表为空返回非0,非空返回0:%d\n", empty_tableSeq(&A));
	printf("顺序表长度:%d\n", length_tableSeq(&A));

	int arrA[3] = { 1,2,3 };
	create_tableSeq(&A, arrA, 3);
	printf("顺序表内容:");
	show_tableSeq(&A);
	printf("顺序表为空返回非0,非空返回0:%d\n", empty_tableSeq(&A));
	printf("顺序表长度:%d\n", length_tableSeq(&A));
	printf("清空成功返回1:%d\n", clear_tableSeq(&A));
	printf("顺序表为空返回非0,非空返回0:%d\n", empty_tableSeq(&A));
	printf("顺序表长度:%d\n", length_tableSeq(&A));
	insert_tableSeq(&A, 1, 100);//在第1个位置上插入100
	printf("顺序表内容:");
	show_tableSeq(&A);
	insert_tableSeq(&A, 1, 101);//在第1个位置上插入101
	printf("顺序表内容:");
	show_tableSeq(&A);
	insert_tableSeq(&A, 2, 99);//在第2个位置上插入99
	printf("顺序表内容:");
	show_tableSeq(&A);
	printf("按序查值,第二个元素是:%d\n",search_key_tableSeq(&A, 2));
	printf("按值查序,100这个元素是第几个:%d\n", search_value_tableSeq(&A, 100));
	int deleteVer=0;
	printf("删除的第二个元素值为:%d\n",delete_tableSeq(&A, 2, deleteVer));
	printf("顺序表内容:");
	show_tableSeq(&A);

	int arrB[3] = { 1,2,3 };
	create_tableSeq(&B, arrB, 3);

	merge_table(&A, &B, &C);
	printf("顺序表内容:");
	show_tableSeq(&C);
	destory_tableSeq(&A);
	destory_tableSeq(&B);
	destory_tableSeq(&C);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值