顺序表的基本操作(完整代码)实验

实验目的和要求:

Status initlist(sqlist &L)

                           Status listinsert( sqlist &L,  int i,  int e )

                           Status listindele( sqlist &L,  int i,  int &e )

                           Status listinprint( sqlist L)

                          void MergeList(sqlist La, sqlist Lb, sqlist &Lc)

                          void inverse(sqlist &Lc)

      完成以上几个函数,实现手工创建两个非递减序列存放于La和 Lb中,并调用MergeList实现数据的合并。合并之后用inverse把Lc中的数据就地逆置(不占用太多额外辅助空间,空间复杂度为常数级别)

关于程序健壮性的内容:

1、对于插入与删除位置若不合法请给出适当提醒

2、若输入的数据不是非递减排列可通过自己写的

      sort()函数排序后再进行后续操作

 实验代码如下:

#include <stdio.h>
#define ERROR 0
#define OK 1
#define MAXSIZE 15
#define OVERFLOW 0
typedef int Status;
typedef int ElemType;
	typedef struct
	{
		ElemType *elem;
		int length;
	}Sqlist;
	Status InitList(Sqlist &L)
{
	L.elem=new ElemType[MAXSIZE];
	if(!L.elem) return(OVERFLOW);
	else {L.length=0;
	return OK;
	}}
	Status ListInsert(Sqlist &L,int i,ElemType e)
	{
		if((i<1)||(i>L.length+1)) return printf("Sorry!Locate is error!");
		else if(L.length==MAXSIZE) return printf("Sorry!Locate is error!");
		else {
			for(int j=L.length -1;j>=i-1;j--)
				L.elem [j+1]=L.elem [j];
			L.elem [i-1]=e;
			++L.length ;
			return OK;
		}
	}
	Status Listindele(Sqlist &L,int i){
		if((i<1)||(i>L.length)) return printf("Sorry!Locate is error");
		else 
			{
				//e=L.elem [i-1];,int &e
				for(int j=i;j<=L.length-1;j++)
					L.elem [j-1]=L.elem [j];
				--L.length ;
				return OK;
		}}
		void Listprint(Sqlist L)
		{
			int i;
			printf("\n顺序表中的数据为:\n");
			for(i=0;i<L.length;i++)
			{
				printf("%5d ",L.elem[i]);
				//if(i%5==0) printf("\n");
			}
		}
		void MergeList(Sqlist LA,Sqlist LB,Sqlist &LC)
		{
			int *pa,*pb,*pc;
			int *pa_last,*pb_last;
			LC.length=LA.length+LB.length;
			LC.elem=new ElemType[LC.length];
			pa=LA.elem ;
			pb=LB.elem ;
			pc=LC.elem ;
			pa_last=LA.elem+LA.length-1;
			pb_last=LB.elem+LB.length-1;
			while((pa<=pa_last)&&(pb<=pb_last))
			{
				if(*pa<=*pb)
					*pc++=*pa++;
				else *pc++=*pb++;
			}
			while(pa<=pa_last)
			{
				*pc++=*pa++;
			}
			while(pb<=pb_last)
			{
				*pc++=*pb++;
			}
		}
		void Inverse(Sqlist &LC)
		{
			ElemType t,i,j;
			for(i=0,j=LC.length-1;i<j;i++,j--)
			{
				t=LC.elem[i];
				LC.elem [i]=LC.elem [j];
				LC.elem [j]=t;
			}
		}
		void sort(Sqlist &L){
			ElemType c;
			for(int j=1;j<=L.length-1;j++)
			for(int i=0;i<=L.length-j-1;i++)
			if(L.elem[i]>L.elem[i+1]){
				c=L.elem[i];
				L.elem[i]=L.elem[i+1];
				L.elem[i+1]=c;
			}
		}
		main(){
			int i,j,e;
		    Sqlist L,L1,L2;
			InitList( L);
			printf("\n 请输入你想创建的顺序表的长度(15以内): \n");
			scanf("%d",&L.length);
			printf("\n 请依次输入%d个整数,以空格分隔:\n",L.length);
			for(i=0;i<L.length;i++)
				scanf("%d",&L.elem[i]);  
			Listprint(L);
			printf("\n请输入要插入元素的位置(1~%d) :\n",L.length+1);
			scanf("%d",&j);
			printf("\n请输入要插入元素的值:\n");
			scanf("%d",&e);
			ListInsert(L,j,e);
			Listprint(L);
			printf("\n请输入要删除元素的位置(1~%d):\n",L.length);
			scanf("%d",&i);
			Listindele(L,i);
			Listprint(L);
			printf("\n将表排序后:\n");
			sort(L);
			Listprint(L);
			InitList( L1);
			printf("\n 请输入你想创建的顺序表的长度(15以内): \n");
			scanf("%d",&L1.length);
			printf("\n 请依次输入%d个整数,以空格分隔:\n",L1.length);
			for(i=0;i<L1.length;i++)
				scanf("%d",&L1.elem[i]); 
			Listprint(L1);
			printf("\n将表排序后:\n");
			sort(L1);
			Listprint(L1);
			MergeList(L,L1,L2);
			Listprint(L2);
			Inverse(L2);
			Listprint(L2);


		}

实验结果:

实验运行的软件为Dev-C++

实验分析:

  实现手工创建两个非递减序列存放于La和 Lb中,并调用MergeList实现数据的合并。合并之后用inverse把Lc中的数据就地逆置(不占用太多额外辅助空间,空间复杂度为常数级别).

   对于插入与删除位置若不合法请给出适当提醒

   输入的数据不是非递减排列可通过自己写的sort()函数排序后再进行后续操作

猜你喜欢

转载自blog.csdn.net/zhu_xian_gang/article/details/125827482