数据结构关于顺序表的一些操作

文章提供了四个C语言程序,分别实现了顺序表的按内容查找、插入、删除和两个已排序顺序表的合并运算。查找运算根据元素内容返回其位置,插入运算在指定位置插入元素,删除运算移除指定位置的元素,合并运算将两个升序顺序表合并成一个新的升序顺序表。
摘要由CSDN通过智能技术生成

顺序表的按内容查找运算

#include <stdio.h>
#define MAX 100
typedef struct seqlist{
	int elem[MAX];
	int last;                   //这里的last表示顺序表最后一个元素的下标值
}SeqList;
int LocateList(SeqList L,int e)
{
	int i=0;
	while(i<=L.last&&L.elem[i]!=e){    //如果是i<=L.last条件结束,则i=L.last+1,会进入下面的else语句返回-1
		i++;                           //如果是L.elem[i]!=e条件结束,那么i<=L.last,会进入下面的if语句,返回i+1
	}
	if(i<=L.last){
		return i+1;                   //因为i代表的是顺序表元素的下标值,而要求返回的是位置值,所以要+1
	}else {
		return -1;
	}
}
int main()
{
	SeqList L;
	int n;
	printf("请输入顺序表元素的个数:");
	scanf("%d",&n);
	int i=0;
	printf("请输入顺序表的元素:")
	for(i=0;i<=n-1;i++){
		scanf("%d",&L.elem[i]);
		L.last=i;                           //注意不要忘记了这一步让last等于顺序表最后一个元素的下标值         
	}
	int e;
	printf("请输入你需要查询的元素:");
	scanf("%d",&e);
	int locate=LocateList(L,e);
	if(locate!=-1){
		printf("你所查询的元素位于第%d个位置",locate);
	}else {
		printf("抱歉,未能找到你所需要查询的元素");
	}
	return 0;
}

顺序表的插入运算

#include <stdio.h>
#define MAX 100
#define OK 1
#define ERROR 0
typedef struct seqlist{
	int elem[MAX];
	int last;
}SeqList;
int InsList(SeqList *L,int i,int e){     //注意这里是*L,因为需要改变顺序表
	if(i<1||i>L->last+2){                //首先判断i的元素是否合法
		printf("插入i值不合法!");        //顺序表最后一个元素的下标值为L->last,位置值为L->last+1,插入的元素也可以插入到
		return ERROR;                    //顺序表的最后面,也就是位置是L->last+2的位置,所以插入的位置不能大于L->last+2   
	}
	if(L->last>=MAX-1){                 //接着判断顺序表是否已经满了,注意是MAX-1,因为L->last代表的是下标值
		printf("表已满,无法插入!");
		return ERROR;
	}
	int k=L->last;                     
	for(k=L->last;k>=i-1;k--){         //这里的思想就是让后一个元素等于前一个元素,依次覆盖掉后一个元素的值
		L->elem[k+1]=L->elem[k];
	}
	L->elem[i-1]=e;                    //因为i代表的是位置,所以第i个位置的下标就是i-1,当i=L->last+2时,不会进入for循环语句,会直接进入这一步
	L->last++;                        //别忘记了最后的L->last要+1,因为顺序表中多了一个元素
	return OK;
}

int main()
{
	SeqList L;
	int n;
	printf("请输入顺序表元素的个数:");
	scanf("%d",&n);
	int i=0;
	printf("请输入顺序表的元素:");
	for(i=0;i<=n-1;i++){
		scanf("%d",&L.elem[i]);
		L.last=i;
	}
	int x,e;
	printf("请输入元素插入的位置:");
	scanf("%d",&x);
	printf("请输入需要插入的元素:");
	scanf("%d",&e);
	int inslist=InsList(&L,x,e);
	if(inslist==1){
		printf("恭喜你,插入元素成功!插入后的顺序表为:");
		for(i=0;i<=L.last;i++){
			printf("%d ",L.elem[i]);
		}
	}else {
		printf("抱歉,插入元素失败!");
	}
	return 0;
}

顺序表的删除运算

#include <stdio.h>
#define MAX 100
#define ERROR 0
#define OK 1
typedef struct seqlist{
	int elem[MAX];
	int last;
}SeqList;
int DelList(SeqList *L,int i,int *e){
	int k;
	if((i<1)||i>L->last+1){               //跟插入算法一样,先判断要删除的位置是否合法
	    printf("删除位置不合法!");
		return ERROR;
	}
	*e=L->elem[i-1];                     //将删除的元素存放到e所指向的变量中
	for(k=i;k<=L->last;k++){
		L->elem[k-1]=L->elem[k];         //让后面一个数覆盖掉前面的数,以此来实现位置的改变
	}
	L->last--;                           //注意最后要-1
	return OK;
}
int main()
{
	SeqList L;
	int n;
	printf("请输入顺序表的元素的个数:");
	scanf("%d",&n);
	int i=0;
	printf("请输入顺序表元素的内容:");
	for(i=0;i<=n-1;i++){
		scanf("%d",&L.elem[i]);
		L.last=i;
	}
	int j,e=0;
	printf("请输入你所需要删除的元素的位置:");
	scanf("%d",&j);
	int dellist=DelList(&L,j,&e);
	if(dellist==1){
		printf("恭喜你删除元素成功!\n");
		printf("你所删除的元素是:%d\n",e);
		printf("删除后的顺序表的内容是:");
		for(i=0;i<=L.last;i++){
			printf("%d ",L.elem[i]);
		}
	}else {
		printf("抱歉,你所需要删除的元素不存在"); 
	}
	return 0;
}

顺序表的合并运算

#include <stdio.h>
#define MAX 100
typedef struct seqlist{
	int elem[MAX];
	int last;
}SeqList;
void mergeList(SeqList *LA,SeqList *LB,SeqList *LC){
	int i=0,j=0,k=0;
	while(i<=LA->last&&j<=LB->last){                  
		if(LA->elem[i]<=LB->elem[j]){
			LC->elem[k]=LA->elem[i];
			i++,k++;                         //注意这里的++,别忘记了
		}else {
			LC->elem[k]=LB->elem[j];
			k++,j++;                        //注意这里的++,别忘记了
		} 
	}
	while(i<=LA->last){            //当第一个while循环结束条件为j<=LB->last时,说明LA中的内容没有合并完,所以进入该循环
		LC->elem[k]=LC->elem[i];
		k++,j++;                        //注意这里的++,别忘记了
	}
	while(j<=LB->last){           //当第一个while循环结束条件为i<=LA->last时,说明LB中的内容没有合并完,所以进入该循环
		LC->elem[k]=LB->elem[j];
		k++,j++;                   //注意这里的++,别忘记了
	}
	LC->last=LA->last+LB->last+1;//LA中有LA->last+1个元素,LB中有LB->last+1个元素,所以LC中有LA->last+LB->last+2个元素,所以最后一个元素下标值为LA->last+LB->last+1
}
int main()
{
	SeqList LA,LB,LC;
	int m;
	printf("请输入第一个线性表的元素个数:");
	scanf("%d",&m);
	int i=0;
	printf("请输入第一个线性表元素的内容:");
	for(i=0;i<=m-1;i++){
		scanf("%d",&LA.elem[i]);
		LA.last=i;                           //别忘记这里让last等于最后一个元素的下标值
	}
	int j=0,t=0;
	for(i=0;i<=m-2;i++){                //冒泡排序,因为该线性表合并算法的前提是两个线性表按照升序排好序
		for(j=0;j<=m-2-i;j++){
			if(LA.elem[j]>LA.elem[j+1]){
				t=LA.elem[j+1];
				LA.elem[j+1]=LA.elem[j];
				LA.elem[j]=t;
			}
		}
	}
	int n;
	printf("请输入第二个线性表的元素个数:");
	scanf("%d",&n);
	printf("请输入第二个线性表元素的内容:");
	for(i=0;i<=n-1;i++){
		scanf("%d",&LB.elem[i]);
		LB.last=i;                              //别忘记这里让last等于最后一个元素的下标值
	}
	for(i=0;i<=n-2;i++){                       //冒泡排序
	    for(j=0;j<=n-2-i;j++){
			if(LB.elem[j]>LB.elem[j+1]){
				t=LB.elem[j+1];
				LB.elem[j+1]=LB.elem[j];
				LB.elem[j]=t;
			}
		}
	}
	mergeList(&LA,&LB,&LC);     //合并线性表
	printf("合并后的线性表的内容为:");
	for(i=0;i<=m+n-1;i++){
		printf("%d ",LC.elem[i]);
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值