数据结构中顺序表的基本操作(纯C语言)

#include <stdio.h>
#define MAX 10
typedef int ElemType;

typedef struct
{
	ElemType elem[MAX];
	int last;
}SqList;

//初始化
void InitList(SqList *L)
{
	L->last=0;
}

//当前元素个数
int LenList(SqList L)
{
	return L.last;
}

//插入操作
int InsertList(SqList *L,int i,ElemType x)
{
	int k;
	if(L->last>=MAX)
	{
		printf("表已满,无法插入\n");
		return 0;
	}
	else if(i<0 || i>L->last+1)
	{
		printf("插入位置不合法\n");
		return 0;
	}
	else
	{
		for(k=L->last;k>i-1;k--)
			L->elem[k]=L->elem[k-1];
		L->elem[i-1]=x;
		L->last++;
		return 0;
	}
}

//删除操作
int DelList(SqList *L,int i)
{
	int k;
	if((L->last<=0) || (i<0) || (i>L->last))
	{
		printf("删除位置不合法\n");
		return 0;
	}
	else
	{
		for(k=i;k<=L->last-1;k++)
			L->elem[k-1]=L->elem[k];
		L->last--;
		return 0;
	}
}

///查找元素
int LocList(SqList L,ElemType x)
{
	int i;
	for(i=0;i<L.last;i++)
	{
		if(L.elem[i]==x)
		{
			printf("%d是线性表中第%d个元素\n",x,i+1);
			return 0;
		}
	}
	printf("没有找到%d\n",x);
	return 0;
}

//逆置线性表
int RevList(SqList *L)
{
	int i,m=L->last/2,n=L->last;
	ElemType t;
	for(i=0;i<m;i++)
	{
		t=L->elem[i];
		L->elem[i]=L->elem[n-1-i];
		L->elem[n-1-i]=t;
	}
	return 0;
}

//合并线性表
int MergeList(SqList *La,SqList *Lb,SqList *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];
			j++;k++;
		}
	}
	while(i<La->last)
	{
		Lc->elem[k++]=La->elem[i++];
	}

	while(j<Lb->last)
	{
		Lc->elem[k++]=Lb->elem[j++];
	}
	Lc->last=k;
	return 0;
}

int main()
{
	SqList La,Lb,Lc;
	int i,x;
	int n,m;//线性表长度

	InitList(&La);//初始化

	//输入La
	printf("请输入线性表La的长度:");
	scanf("%d",&n);
	La.last=n;
	printf("请输入线性表La中的元素\n");
	for(i=0;i<n;i++)
		scanf("%d",&La.elem[i]);
	
	//插入
	printf("\n请输入要插入到线性表La中的位置i和要插入的元素x\n");
	scanf("%d%d",&i,&x);
	InsertList(&La,i,x);
	printf("\n线性表\n");
	for(i=0;i<La.last;i++)
		printf("%d ",La.elem[i]);
	printf("\n");

	//删除
	printf("\n请输入要删除的元素的位置\n");
	scanf("%d",&i);
	DelList(&La,i);
	printf("\n线性表La\n");
	for(i=0;i<La.last;i++)
		printf("%d ",La.elem[i]);
	printf("\n");

	//查找
	printf("\n请输入要查找的元素:");
	scanf("%d",&x);
	LocList(La,x);

	//逆置
	RevList(&La);
	printf("\n逆置后的线性表La\n");
	for(i=0;i<La.last;i++)
		printf("%d ",La.elem[i]);
	printf("\n");


	//初始化Lb
	InitList(&Lb);
	//输入Lb
	printf("\n请输入线性表Lb的长度:");
	scanf("%d",&m);
	Lb.last=m;
	printf("\n请输入线性表Lb中的元素\n");
	for(i=0;i<m;i++)
		scanf("%d",&Lb.elem[i]);

	//初始化Lc
	InitList(&Lc);

	//合并La,Lb
	MergeList(&La,&Lb,&Lc);
	printf("\n合并后La和Lb后的线性表\n");
	for(i=0;i<Lc.last;i++)
		printf("%d ",Lc.elem[i]);
	printf("\n\n");
	return 0;
}

  • 15
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值