您的位置:首页 > 理论基础 > 数据结构算法

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

2015-10-01 15:52 429 查看
第一次数据结构实验,做的不好..............

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

/*
实验要求:
写出
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
,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
,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
);
}
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;
}

博客断更一星期了,惭愧............
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: