• 河南理工大学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;
    } 
    

      

      

  • 相关阅读:
    整理前端面试题1
    前端面试题2
    6.显示锁Lock 和 线程通信Condition
    5.创建执行线程的方式之三 :实现Callable 接口
    4.闭锁 CountDownLatch
    3.ConcurrentHashMap 锁分段机制 Copy-On-Write
    2.原子变量 CAS算法
    1.volatile关键字 内存可见性
    13.MyBatis注解式开发
    12.查询缓存
  • 原文地址:https://www.cnblogs.com/tonghao/p/4833723.html
Copyright © 2020-2023  润新知