您的位置:首页 > 理论基础 > 数据结构算法

数据结构中线性顺序表的基本操作(增删改查及合并)

2018-01-25 09:31 465 查看
#include <stdio.h>
#define MAXSIZE 20
typedef int Elemtype;

typedef struct Node{
Elemtype data[MAXSIZE];
int length;
}sqList;
//初始化
void initList(sqList *L)
{
L->length=0;
printf("OK\n");
}
//判断空表
void ListEmpty(sqList *L)
{
if(L->length==0)
printf("空表\n");
else
printf("非空表\n");
}
//清空表
void clearList(sqList *L)
{
L->length=0;	/*因为是通过Length来访问数据,Length==0则无法访问,相当于空表*/
printf("OK\n");
}
//求表长
int ListLength(sqList *L)
{
return L->length;
}
//查第i个元素
void getElem(sqList *L,int i,Elemtype *e)
{
if(L->length==0||i<1||i>L->length)	//判断L是否空表且i是否正确
return;
*e=L->data[i-1];
printf("OK\n");
}
//查某个元素的位置
int LocateElem(sqList *L,Elemtype e)	//返回的是位置(不是下标),肯定用int
{
int i;
if(L->length==0)
return 0;
for(i=0;i<L->length;i++)
if(L->data[i]==e)
return i+1;
return 0;
}
//将元素插入指定位置
void insertList(sqList *L,int i,Elemtype e)
{
int j;
if(L->length==MAXSIZE)				//判断是否表满
return;
if(i<1||i>L->length+1)				//判断i是否正确
return;
for(j=L->length-1;j>=i-1;j--)		//从最后开始往右挪 插入得先挪再赋值
L->data[j+1]=L->data[j];
L->data[i-1]=e;
L->length++;
}
//删除指定位置的元素
void deleteList(sqList *L,int i,Elemtype *e)
{
int j;
if(L->length==MAXSIZE)				//判断是否表满
return;
if(i<1||i>L->length)				//判断i是否正确
return;
*e=L->data[i-1];					//删除得先赋值再挪  往左挪
for(j=i;j<L->length;j++)
L->data[j-1]=L->data[j];
L->length--;
printf("OK\n");
}
//遍历
void TraverseList(sqList *L)
{
int i;
if(L->length==0)
printf("NULL\n");
else
{
for(i=0;i<L->length;i++)
printf("%d ",L->data[i]);
printf("\n");
}
}
//合并无序顺序表(不包括重复元素)
void unionList(sqList *La,sqList *Lb,sqList *Lc)
{
int i,j,flag;
for (i = 0; i < La->length; i++)
Lc->data[i] = La->data[i];
Lc->length = La->length;
flag = 0;
for (i = 0; i < Lb->length && Lc->length<MAXSIZE; i++)
{
for (j = 0; j < La->length && flag==0; j++)
{
if (La->data[j] == Lb->data[i] )
flag=1;
}
if (flag == 1)
continue;
else
Lc->data[Lc->length++] = Lb->data[i];
}
}
void Del_in_range(sqList *L,int x,int y)
{//删除x和y之间的元素,时间复杂度为O(n)
int backStep=0;
for(int i=0;i<L->length;i++)
{
if(L->data[i]>=x&&L->data[i]<=y)
backStep++;
else
L->data[i-backStep]=L->data[i];
}
L->length=L->length-backStep;
}
int main()
{
sqList La,Lb,Lc;
int i,j,t,temp;Elemtype e;
initList(&Lb);
for(i=1;i<=5;i++)
insertList(&Lb,i,i);
while(i=getchar())
{
switch(i)
{
case '1':initList(&La);break;
case '2':ListEmpty(&La);break;
case '3':clearList(&La);break;
case '4':printf("顺序表的长度为%d\n",ListLength(&La));break;
case '5':printf("输入插入的位置以及插入元素\n");
scanf("%d %d",&t,&e);
insertList(&La,t,e);
break;
case '6':printf("输入删除元素的位置");
scanf("%d",&t);
deleteList(&La,t,&e);
break;
case '7':printf("输入要查找的位置\n");
scanf("%d",&t);
getElem(&La,t,&e);
printf("%d",e);
break;
case '8':unionList(&La,&Lb,&Lc);break;
case '9':TraverseList(&La);break;
case '0':TraverseList(&Lc); break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息