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

#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; 
}

猜你喜欢

转载自blog.csdn.net/weixin_40908734/article/details/79157765