河南理工大学14级数据结构第一次上机实验课题试验

实验目的:写出一个程序,可以完成对两个数列的 1、元素删除  2  元素插入  3   数列输出 4  数列合并 5  数列输入等功能

试验步骤:

1、 输入   status initlist(sqlist &L)

2、 插入   status listinsert(sqlist &L, int I ,int e)

3、 删除   status listindele(sqlist &L,int I,int &e)

4、 输出   status listinprint(sqlist L)

5、 合并   void mergelist(sqlist La,sqlist Lb,sqlist &Lc)

等几个函数,实验手工创建两个非递减序列存放于La

 Lb中,并调用MergeList实现数据的合并。

关于程序健壮性的内容:

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

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

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

代码实现:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAX 1000
#define MAXM 10
using namespace std;
typedef int Status;
bool flag;
char a[10];
int Lx[MAX],Ly[MAX],L3[MAX<<1];
int lengtha,wrong,lengthb,n,m,x,k;
typedef struct
{
	int *elem;
	int length;//当前表中元素的个数(肯定小于数组单元的个数)
	int listsize;//当前顺序表中数组单元的个数
}sqlist;
Status initlist(sqlist &L)//创建线性表 
{
	L.elem=(int *)malloc(sizeof(sqlist)*MAX);//=ElemType[MAX];
	if(!L.elem) return -1;
	L.length=0;
	return 1;
}
Status listshuru(sqlist &L)//输入数据 
{
	int val;
	for(int i=0;i<n;i++)
	{
		scanf("%d",&val);
		L.elem[i]=val;
		L.length++;
	}
	return 1;
}
void paixu(sqlist &L)//排序 
{
	sort(L.elem,L.elem+n);
	//return 1;
}
Status panduanrong(sqlist &L)//判断是否需要扩容 
{
	if(L.length>MAX)
	    return -1;
	else 
	    return 1;
}
Status kuorong(sqlist &L)//进行扩容 
{
	int *newbase=(int *)realloc(L.elem,(L.listsize+MAXM)*sizeof(sqlist));//扩容 
	    if(!newbase)
	        return -1;
	return 1;
}
Status listinsert(sqlist &L,int i,int e)//插入数据 
{
	if(i<1||i>L.length+1)
	    return -1;	
	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 1;
}

Status listdele(sqlist &L,int i,int &e)//删除数据 
{
	if(i<1||i>L.length)  return -1;
	int p=i-1;//要被删除的位置 
	e=p;//记录被删除的位置的值 
	int q=L.length-1;//表尾元素 
	for(++p;p<=q;++p)
	    L.elem[p-1]=L.elem[p];
	--L.length;
	return 1;
}
Status listinprit(sqlist L)//输出数据 
{
	for(int i=0;i<L.length;i++)
	    printf("%d ",L.elem[i]);
	printf("
");
	return 1;
}
Status listclear(sqlist &L)//清空表 
{
	L.length=0;
	return 1;
}
void MergeList()//合并表 
{
	int j=0;
	for(int i=0;i<lengtha;i++)
	    L3[i]=Lx[i];
	for(int i=lengtha;i<lengtha+lengthb;i++)
	    L3[i]=Ly[j++];
}
char Y[]={"YES"};
char N[]={"NO"};
void caozuopanduan()
{
	wrong=0;
	while(!wrong)
	{
		scanf("%s",a);
		if(strcmp(a,Y)!=0&&strcmp(a,N)!=0)
			printf("您的输入有误,请重新输入
");
		else
		    wrong=1;	
	}		
}
Status judgeclear(sqlist &L)
{
	if(L.length==0)
	    return 1;
	else 
	    return -1;
} 
int main()
{
	int k,i,t;
	printf("                 ***********您好,欢迎使用本系统***********

");
	printf("1 进行操作请输入 YES
2 退出系统请输入 NO
");
    caozuopanduan();
    system("cls"); 
    t=0;
	if(a[0]=='Y')
	{		
		printf("请输入一个n值,代表你要构建的线性表的长度
");
		while(scanf("%d",&n)!=EOF)
		{
			memset(Lx,0,sizeof(Lx));
			memset(Ly,0,sizeof(Ly));
			memset(L3,0,sizeof(L3));
			system("cls"); 
			for(i=1;i<=2;i++)
			{			
				sqlist L1;
				if(initlist(L1)==-1)
				{
					printf("线性表构建失败,请重新输入n值
");
					continue;
				}
				printf("请为L%d输入n个数据
",i);
				listshuru(L1);
				system("cls"); 
				printf("L%d排序后的结果
",i);
				paixu(L1);
				listinprit(L1);
				//system("cls"); 
				printf("是否执行插入操作,是 请输入YES,不是请输入NO
");		
	            caozuopanduan();
	            system("cls"); 
				if(a[0]=='Y')
				{					
					printf("请在插入操作前输入您想要插入的位置以及要插入的数
");
					int vis=0;
					flag=false;
					while(!vis)
					{
						scanf("%d%d",&m,&x);
						system("cls"); 
						if(listinsert(L1,m,x)==-1)
							printf("您的插入位置不合法,请在数据范围内输入,(注:1<=m<=n)
");
						else
						    vis=1;
						if(vis==1)
						{
							if(panduanrong(L1)==-1)
							{
								printf("若需要扩容输入YES,若不需要扩容输入NO重新进行所有操作,请输入:
");		
	                            caozuopanduan();
	                            system("cls"); 
								if(a[0]=='Y')
								{
									if(kuorong(L1)==-1)
								    {
								    	printf("对不起,扩容失败,请重新进行所有操作
");
								    	flag=true;
								    	break;
								    }
								    else
								        printf("恭喜您,扩容成功
");
								}						
								else
								{
									flag=true;
									break;
								}
							}
						}
					}
				    if(flag) continue;
				    system("cls"); 
					printf("输出插入后的序列
");
					listinprit(L1);
				}
			    printf("是否执行删除操作,是 请输入YES,不是请输入NO
");
	            caozuopanduan();	
				system("cls"); 	
				if(a[0]=='Y')
				{
					printf("再进行删除操作前,请您先输入要删除的位置
");
					int b,visb=0;
					while(!visb)
					{
						scanf("%d",&b);
						system("cls"); 
					    if(listdele(L1,b,k)==-1)
					    	printf("您的插入位置不合法,请在数据范围内输入,(注:1<=b<=n)
");
						else
						    visb=1;
						if(visb==1)
						{
						    printf("输出删除元素后的序列
");
							listinprit(L1);
						}
					}
				} 
				if(i==1)
				{
					for(int j=0;j<L1.length;j++)
				    	Lx[j]=L1.elem[j];
				    lengtha=L1.length;
				}
				else
				{
					for(int j=0;j<L1.length;j++)
				        Ly[j]=L1.elem[j];
				    lengthb=L1.length;
				}   
				printf("清空数列线性表
");
				listclear(L1);
				wrong=0;
				while(!wrong)
				{
					if(judgeclear(L1))
					{
						printf("清空成功
");
						wrong=1;
					}
					else
					   printf("清空失败,我们会为您继续清空
");	
				}		
		    }
		    printf("是否执行合并操作,是 请输入YES,不是请输入NO
");	
	        caozuopanduan();
			system("cls"); 	
			if(a[0]=='Y') 
			{
				MergeList();
				printf("输出合并后的序列
");
				for(int j=0;j<lengtha+lengthb;j++)
				   printf("%d ",L3[j]);
				printf("
");
			}
			printf("已经执行到第%d次,是否继续执行,是 请输入YES,不是请输入NO
",++t);
			caozuopanduan();		
			if(a[0]=='N')
			{
			    if(t>=1)
			    printf("请输入一个n值,代表你要构建的线性表的长度
");
			    break;
			} 			    
			system("cls");     
		}
	}
	return 0;
} 

  

  

原文地址:https://www.cnblogs.com/tonghao/p/4833723.html