我是靠谱客的博主 幸福外套,最近开发中收集的这篇文章主要介绍数据结构实验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:合并*****nn");
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;
}


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


最后

以上就是幸福外套为你收集整理的数据结构实验1_顺序表的操作的全部内容,希望文章能够帮你解决数据结构实验1_顺序表的操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部