数据结构实验1_顺序表的操作


第一次数据结构实验,做的不好..............

顺序表,其实就是一个一维数组,只是要加上动态分配空间的操作..............


/*
	实验要求:
	写出
	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)
	等几个函数,实验手工创建两个非递减序列存放于La和
	 Lb中,并调用MergeList实现数据的合并。
	关于程序健壮性的内容:
	1、对于插入与删除位置若不合法请给出适当提醒
	2、若输入的数据不是非递减排列可通过自己写的sort()函数排序后再进行后续操作
*/
#include<stdio.h>
#include<stdlib.h>
const int size=100,add=20;//初始大小和增加大小 
struct sqlist
{
	int *base;//存储空间首地址 
	int lenth;//长度 
	int maxlenth;//容量 
};
void init_list(sqlist &list)//创建和初始化顺序表 
{
	list.base=new int[size];
	list.lenth=0;
	list.maxlenth=size;
	printf("创建顺序表完成!请继续操作!\n");
	return;
}
void list_insert(sqlist &list,int i,int x)//在第 i 个位置插入元素 x  
{
	if(i>0&&i<=list.lenth)//长度合法
	{
		int temp=list.lenth,k;
		if(list.lenth==list.maxlenth)// 否则就拓展 
		{
			printf("空间不足,是否拓展内存?\n 1:是 2:否\n");
			int key;
			scanf("%d",&key);
			if(key==1)
			{
				int *newbase=(int *)realloc(list.base,(list.maxlenth+add)*sizeof(int));
				if(!newbase)
				{
					printf("计算机内存不足,空间分配失败!请重新操作!\n"); 
					return;
				}
				list.base=newbase;
				list.maxlenth+=add;
			}
			else
			{
				printf("操作已取消,请重新操作!\n"); 
				return;
			}
		}
		for(k=temp;k>=i;--k)
		{
			list.base[k]=list.base[k-1];
		}
		list.base[i-1]=x;
		++list.lenth;
		printf("操作完成,请继续操作!\n");
	}
	else
	{
		printf("操作请求失败,请重新操作!\n");
	}
}
void list_delete(sqlist &list,int i,int &x)//删除第 i 个元素,保存在 x 中 
{
	if(i>0&&i<list.lenth)
	{
		x=list.base[i-1];
		for(int k=i-1;k<list.lenth+1;++k)
		{
			list.base[k]=list.base[k+1];
		}
		--list.lenth;
		printf("删除第%d个元素 %d 成功,请继续操作!\n",i,x);
	}
	else
	{
		printf("操作请求失败,请重新操作!\n");
	}
}
void list_print(sqlist list)//输出线性表中元素 
{
	if(list.lenth)
	{
		printf("%d",list.base[0]);
		for(int i=1;i<list.lenth;++i)
		{
			printf(" %d",list.base[i]);
		}
		printf("\n输出完成,请重新操作!\n");
	}
	else
	{
		printf("\n顺序表为空,请重新操作!\n");
	}
}
void sort(int a[],int low,int high)//快速排序
{
    int i=low,j=high-1,k,temp=a[i]; 
    if(low<high)//控制递归的出口 
    {
        while(i<j) 
        {
            while((a[j]>=temp)&&(i<j))//查找比标志小的 
            {
                j--; 
            }
            a[i]=a[j];//挪动位置 
            while((a[i]<=temp)&&(i<j))//查找比标志大的 
            {
                i++; 
            }  
            a[j]=a[i];//继续挪动位置 
        }
        a[i]=temp;//移动标志 
        sort(a,low,i);//分部分递归 
        sort(a,j+1,high);
    }
}
void merge_list(sqlist la,sqlist lb,sqlist &lc)//线性表元素集合的有序合并 
{
	init_list(lc);
	int *pa=la.base,*pb=lb.base,*pc=lc.base,*pa_end,*pb_end;
	pa_end=pa+la.lenth;pb_end=pb+lb.lenth;
	while((pa<pa_end)&&(pb<pb_end))//归并元素 
	{
		while(*pa==*pc)//去掉lc 中相同的元素 
		{
			*pa++;
		} 
		while(*pb==*pc)
		{
			*pb++;
		}
		if(*pa<*pb)//小的排在前面 
		{
			*pc++=*pa++;
		}
		else if(*pa>*pb)//大的排在后面 
		{
			*pc++=*pb++;
		}
		else//相同的只保留一个 
		{
			*pc++=*pa++;
			*pb++;
		}
		++lc.lenth; 
	}
	while(pa<pa_end)//连接la最后可能剩下的部分 
	{
		*pc++=*pa++;
		++lc.lenth; 
	}
	while(pb<pb_end)//连接lb最后可能剩下的部分 
	{
		*pc++=*pb++;
		++lc.lenth; 
	}
	printf("合并完成,请继续操作!\n"); 
}
int main()
{
	sqlist list[3];
	int come=1,kase=0,key,ok=0;
	while(1)
	{
		printf("*****|请输入操作指令|*****\n");
		printf("*****|0:退出*****\n");
		printf("*****|1:创建*****\n");
		printf("*****|2:插入*****\n"); 
		printf("*****|3:删除*****\n");
		printf("*****|4:输出*****\n");
		printf("*****|5:合并*****\n\n");
		printf("请输入操作指令:\n");
		scanf("%d",&come);
		if(come==0)
		{
			printf("退出成功,谢谢使用!\n");
			return 0;
		}
		else if(!kase&&come==1)//创建 
		{
			int n;
			init_list(list[1]);init_list(list[2]);
			printf("请输入表 1 的元素个数(0<=n<=%d):\n",list[1].maxlenth);
		//	p[1]=list[1].base;p[2]=list[2].base;
			scanf("%d",&n);
			list[1].lenth=n;
			printf("请输入表中元素:\n");
			for(int i=0;i<n;++i)
			{
				scanf("%d",&list[1].base[i]);
			}
			printf("请输入表 2 的元素个数(0<=n<=%d):\n",list[2].maxlenth);
			scanf("%d",&n);
			list[2].lenth=n;
			printf("请输入表中元素:\n");
			for(int i=0;i<n;++i)
			{
				scanf("%d",&list[2].base[i]);
			}
			kase=1;//标记是否创建过顺序表 
			printf("操作完成,请继续操作!\n"); 
			printf("请输入指令:1 返回主程序\n");
			scanf("%d",&key);
			if(key==1)
			{
				system("cls"); 
			}
		}
		else if(kase&&come==2)//插入 
		{
			int n,i,x;
			printf("请输入需要操作的对象(表 n(0<=n<=%d)),插入位置,插入元素:\n",ok+1);
			//控制处理对象的范围 
			scanf("%d%d%d",&n,&i,&x);
			if(n>=0&&n<=ok+1)
			{
				list_insert(list[n],i,x);
			} 
			else
			{
				printf("操作错误,请重新输入!\n");
			}
			printf("请输入指令:1 返回主程序\n");
			scanf("%d",&key);
			if(key==1)
			{
				system("cls"); 
			}
		}
		else if(kase&&come==3)//删除 
		{
			int n,i,x;
			printf("请输入需要操作的对象(表 n(0<=n<=%d)),删除位置:\n",ok+1);
			scanf("%d%d",&n,&i);
			if(n>=0&&n<=ok+1)
			{
				list_delete(list[n],i,x);
			} 
			else
			{
				printf("操作错误,请重新输入!\n");
			}
			
			printf("请输入指令:1 返回主程序\n");
			scanf("%d",&key);
			if(key==1)
			{
				system("cls"); 
			}
		}
		else if(kase&&come==4)//输出 
		{
			int n;
			printf("请输入需要操作的对象(表 n(0<=n<=%d))\n",ok+1);
			scanf("%d",&n);
			if(n>=0&&n<=ok+1)
			{
				list_print(list[n]);
			} 
			else
			{
				printf("操作错误,请重新输入!\n");
			}
			printf("请输入指令:1 返回主程序\n");
			scanf("%d",&key);
			if(key==1)
			{
				system("cls");  
			}
		}
		else if(kase&&come==5)//合并 
		{
			sort(list[1].base,0,list[1].lenth);//对表排序 
			sort(list[2].base,0,list[2].lenth);
			merge_list(list[1],list[2],list[0]);//合并 
			ok=1;//改变对象的个数 
			printf("请输入指令:1 返回主程序\n");
			scanf("%d",&key);
			if(key==1)
			{
				system("cls");  
			}
		}
		else
		{
			printf("操作错误,请重新输入!\n");
			printf("请输入指令:1 返回主程序\n");
			scanf("%d",&key);
			if(key==1)
			{
				system("cls");  
			}
		}
	}
	return 0;
}


博客断更一星期了,惭愧............


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值