ZZU的学弟学妹们不要抄作业哦~(`Д´)
一、实验目的
1.掌握线性表的顺序存储结构的表示和实现方法。
2.掌握顺序表基本操作的算法实现。
3.了解顺序表的应用。
二、实验内容
1.建立顺序表,并在顺序表上实现插入、删除和查找等基本操作。
2.删除有序顺序表中的重复元素。
三、实验要求
1.建立顺序表并实现相关基本操作。
(1)根据输入顺序表的长度n和各个数据元素值建立一个顺序表,并输出顺序表中各元素值,观察输入的内容与输出的内容是否一致。
(2)在顺序表的第i个元素之前插入一个值为x的元素,并输出插入后的顺序表中各元素值。
(3)删除顺序表中第i个元素,并输出删除后的顺序表中各元素值。
(4)在顺序表中查找第i个元素,如果查找成功,则显示“查找成功”和该元素在顺序表中的位置,否则显示“查找失败”。
2.删除有序顺序表中的重复元素。
(1)根据输入的n个非递减的有序数据建立一个有序顺序表,并输出有序顺序表中各元素值。
(2)删除有序顺序表中所有的重复元素,并显示删除后的有序顺序表中各元素值。
四、详细程序清单
#include<stdio.h>
#define MAXLEN 30
typedef struct
{
int elem[MAXLEN];
int length;
}Sqlist;
void Create(Sqlist &L)//创建
{
int n,i=0;
printf("请输入线性表元素个数(小于30)\n");
while(scanf("%d",&n)&&n>30||n<0)
{
printf("数据不合法,请重新输入\n");
}
printf("请输入%d个数,用空格分开\n",n);
while(n--)
{
scanf("%d",&L.elem[i]);
i++;
L.length++;
}
}
void Show(Sqlist L)//显示
{
printf("当前顺序表中元素有:\t");
for(int i=0;i<L.length;i++)
{
printf("%d ",L.elem[i]);
}
printf("\n");
}
int Insert(Sqlist &L,int i,int x)//插入
{
int key=1;
if (i<1||i>L.length+1)
{
printf("插入位置不正确\n");
key=0;
return key;
}
for(int j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];
L.elem[i-1]=x;
L.length++;
return key;
}
int Delete(Sqlist &L,int i)//删除
{
int key=1;
if (i<1||i>L.length)
{
printf("删除位置不正确\n");
key=0;
return key;
}
for(int j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];
L.length--;
return key;
}
int Search(Sqlist L,int e)//查找
{
int i,key=1;
for (i=0;i<L.length&&L.elem[i]!=e;i++);
if (i<L.length)
{
printf("查找成功,%d在",e);
for(;i<L.length;++i)
if(e==L.elem[i])
printf("第%d",i+1);
printf("的位置\n");
return key;
}
else {printf("查找失败\n"); key=0;return key;}
}
void DelSqlist(Sqlist &L)//去重
{
int i,j,temp;
for (j=0;j<L.length;j++)
for (i=0;i<L.length-1-j;i++)
{
if(L.elem[i]>L.elem[i+1])
{
temp=L.elem[i];
L.elem[i]=L.elem[i+1];
L.elem[i+1]=temp;
}
}
i=0;
while(i<L.length-1)
if (L.elem[i]==L.elem[i+1])
{
for (j=i+1;j<L.length;j++)
L.elem[j-1]=L.elem[j];
L.length--;
}
else
i++;
}
int main()
{
int i,x,e,slect,key;
Sqlist L;
L.length=0;
Create(L);
Show(L);
printf("请选择操作:\t 1.插入元素\t2.删除元素\t3.查找元素\t4.删除重复元素\n");
while(~scanf("%d",&slect))
{
key=0;
switch (slect)
{
case 1:if (L.length>=MAXLEN) {
printf("顺序表中已放满元素,无法插入新元素\n");
break;}
while(key==0){
printf("请输入要插到的位置和元素值\n");
scanf("%d%d",&i,&x);
key=Insert(L,i,x);
Show(L);
}break;
case 2:while(key==0){
printf("请输入要删除的位置\n");
scanf("%d",&i);
key=Delete(L,i);
Show(L);
}break;
case 3: while(key==0){
printf("请输入要查找的元素\n");
scanf("%d",&e);
key=Search(L,e);
}break;
case 4:DelSqlist(L);Show(L);break;
default:printf("输入错误,请重新输入\n"); break;
}
printf("请选择操作:\t 1.插入\t2.删除\t3.查找\t4.删除重复元素\n");
}
}
五、程序运行结果
六、实验心得体会
1.考虑问题要全面,尽可能增强程序的鲁棒性;
2.将程序模块化,能使其更加可读、易找错、易修改;
3.函数和变量的命名要能一眼看出来它的意思;
4.错误很多,调试很烦,要有耐心。