数据结构线性表的顺序存储结构C语言实现.docx
《数据结构线性表的顺序存储结构C语言实现.docx》由会员分享,可在线阅读,更多相关《数据结构线性表的顺序存储结构C语言实现.docx(16页珍藏版)》请在冰豆网上搜索。
![数据结构线性表的顺序存储结构C语言实现.docx](https://file1.bdocx.com/fileroot1/2023-1/26/0b2af578-3c98-41e1-89cc-58adfe3ca440/0b2af578-3c98-41e1-89cc-58adfe3ca4401.gif)
数据结构线性表的顺序存储结构C语言实现
数学与信息技术学院2016~2017(下)学年
计科专业2015级《数据结构》实验报告1
学号:
2015201018姓名:
汪继超
实验名称
线性表的顺序存储结构
完成时间
实验目的
1.掌握线性表的概念,掌握顺序表的概念及其各种运算的原理。
2.通过对线性表的查找、插入和删除算法的实现以加深对线性表的顺序存储结构的理解,为加强线性表在实际中的应用打下基础。
3.用C语言实现并上机调试通过,认真填写实验报告
实验内容
1.已知某线性表(a1,a2,……an)=(1,2,……,n),利用C语言编程完成以下操作:
(1)定义函数initsq_L():
创建该线性表的顺序存储结构;
(2)定义函数insertsq_L():
在第I个数据元素前插入X,I和X均用键盘输入;
(3)定义函数deletesq_L():
将原顺序表中的Ai删除,I由键盘输入;
(4)定义函数printsq_L():
输出线性表的内容。
提示:
该线性表的数据可以是一组学生的成绩。
实验要求
用C语言实现并上机调试通过,认真填写实验报告。
掌握线性表的概念,掌握顺序表的概念及其各种运算的原理。
实验过程:
#include
#include
#include
#include
#defineLIST_INIT_SIZE10
#defineLISTINCREMENT10
typedefintElemType;
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
voidcolor(constunsignedshortcolor1)//颜色函数
{
/*仅限改变0-15的颜色;如果在0-15那么实现他的颜色因为如果超过15后面的改变的是文本背景色*/
if(color1>=0&&color1<=15)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color1);
//如果不在0-15的范围颜色,那么改为默认的颜色白色;
else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
}
voidinitsq_L(SqList*L)//表初始化
{
L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));//开辟空间
if(!
L->elem)
{
printf("Allocationerror.\n");
exit(0);
}
L->length=0;
L->listsize=LIST_INIT_SIZE;
color(13);
printf("\n表初始化成功!
\n");
color(10);
}
voidprintsq_L(SqList*L)//输出
{
inti;
for(i=0;ilength;i++)
{
printf("%5d",L->elem[i]);
if((i+1)%10==0)printf("\n");
}
printf("\n");
}
voiddeletesq_L(SqList*L,inti)//删除算法操作
{
intk,j;
color(13);
printf("\n顺序表当前数据:
\n");
printsq_L(L);
color(10);
printf("请输入删除元素的位置:
");
scanf("%d",&k);
color(13);
printf("\n顺序表删除元素前:
\n");
printsq_L(L);
if((k<1)||(k>L->length))exit
(1);
for(j=k;j<=L->length;j++)
L->elem[j-1]=L->elem[j];
--L->length;
printf("顺序表删除元素后:
\n");
printsq_L(L);
color(10);
}
/*
intLocateElem_Sq(SqList*L,ElemTypee,void(*compare)(ElemType,ElemType))
{
int*p;
//在线性表L中查找第一个值与e满足compare()的元素的位序
//若找到,则返回其在L中的位序,否则返回0
inti=1;
p=L->elem;
while((i<=L->length)&&(!
(*compare)(*p++,5)))++i;
if(i<=L->length)returni;
elsereturn0;
}
*/
voidsearch_L(SqList*L,ElemTypee)//查找操作
{
intj,flag=0;
color(13);
printf("\n顺序表当前数据:
");
printsq_L(L);
color(10);
printf("\n请输入要查找的元素:
");
scanf("%d",&e);
color(13);
for(j=0;jlength;j++)
if(L->elem[j]==e)
{
flag=1;
printf("\n找到元素:
%d位置为%d\n",L->elem[j],j+1);
color(10);
}
if(flag==0)printf("\n没有找到该元素\n");
color(10);
}
voidmodify_L(SqList*L,ElemTypee1,ElemTypee2)//修改操作
{
intj,n,flag=0;
color(13);
printf("\n顺序表当前数据:
");
printsq_L(L);
color(10);
printf("\n请输入要修改的元素:
");
scanf("%d",&e1);
color(13);
for(j=0;jlength;j++)
if(L->elem[j]==e1)
{
flag=1;
printf("\n找到元素:
%d位置为%d",L->elem[j],j+1);
printf("\n\n[1.修改2.不修改]请输入:
");
scanf("%d",&n);
if(n!
=1)break;
if(n==1)
{
printf("\n元素%d改为:
",e1);
scanf("%d",&e2);
L->elem[j]=e2;
printf("\n修改成功!
\n");
printf("\n修改后顺序表的数据:
");
printsq_L(L);
break;
}
}
if(flag==0)printf("\n没有找到该元素\n");
color(10);
}
voidinsertsq_L(SqList*L,inti,ElemTypee)//插入算法函数
{
ElemType*newbase;
intj;
if(i<0||i>L->length)
{
printf("\n插入元素不合法!
\n");
exit(0);
}
if(L->length>=L->listsize)
{
//开辟更大的空间
newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)exit
(1);
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
for(j=L->length-1;j>=i;--j)
L->elem[j+1]=L->elem[j];
L->elem[i]=e;
++L->length;
}
voidInsertsq_L(SqList*L,inti,ElemTypee)//插入算法函数【面向用户】
{
intk,s;
color(13);
printf("\n顺序表当前数据:
\n");
printsq_L(L);
color(10);
printf("请输入插入的位置和元素,以空格隔开:
");
scanf("%d%d",&k,&s);
color(13);
/*先判断位置是否合法,合法执行插入操作,反之则不执行。
*/
if(k<0||k>L->length)
{
printf("\n插入元素不合法!
\n");
}
else
{
printf("\n顺序表插入元素前:
\n");
printsq_L(L);
insertsq_L(L,k-1,s);
printf("\n顺序表插入元素后:
\n");
printsq_L(L);
}
color(10);
}
voidjianbiao(SqList*L)//建表:
往表里放元素
{
inti,p,count;
color(13);
printf("\n请输入您要创建的数据条数:
");
scanf("%d",&count);
printf("\n请输入数据:
");
for(i=0;i{
scanf("%d",&p);
insertsq_L(L,i,p);
}
fflush(stdin);//清空在此前输入缓冲区
printf("\n已创建数据:
");
printsq_L(L);
color(10);
}
voidMenu()
{
printf("欢迎来到顺序表算法操作中心\n\n");
printf("************************************菜单**************************************\n");
printf("*1.表初始化2.建表*\n");
printf("*3.插入算法操作4.删除算法操作*\n");
printf("*5.查找算法操作6.修改算法操作*\n");
printf("*7.打印算法操作0.退出*\n");
printf("******************************************************************************\n");
}
voidmain()
{
inte1=0,e2=0,i=0,e=0,n,flag;//b为元素位置,c为元素
chara;
system("title汪继超:
2015201018");
SqList*L;
L=(SqList*)malloc(sizeof(SqList));
color(10);
start:
do
{
Menu();
printf("\n请选择你需要操作的步骤(0--7):
");
fflush(stdin);//清空在此前输入缓冲区
scanf("%d",&n);
if(n>=0&&n<=7)
{
flag=1;break;
}
else
{
flag=0;
system("cls");
printf("您输入有误,请重新选择!
\n");
}
}
while(flag==0);
while(flag==1)
{
switch(n)
{
case1:
initsq_L(L);break;/*表初始化*/
case2:
jianbiao(L);break;/*建表*/
case3:
Insertsq_L(L,i,e);break;/*插入*/
case4:
deletesq_L(L,i);break;/*删除*/
case5:
search_L(L,e);break;/*查找*/
case6:
modify_L(L,e1,e2);break;/*修改*/
case7:
printsq_L(L);break;/*打印*/
case0:
free(L);exit(0);break;
default:
system("cls");gotostart;
}
printf("\n是否继续进行(yorn):
");
fflush(stdin);//清空在此前输入缓冲区
a=getchar();
if(a=='y'||a=='Y')
{
flag=1;
system("cls");/*清屏*/
Menu();/*调用菜单函数*/
printf("请再次选择你需要操作的步骤(0--7):
");
fflush(stdin);//清空在此前输入缓冲区
scanf("%d",&n);
}
else
{
free(L);//释放顺序表
exit(0);
}
}
}
实验结果:
1.表初始化:
2.建表:
注:
若以空格键隔开数据,多输入无影响,计算机读取完指定数目数据后,自动结束读取。
3-1.插入位置合法:
3-2.插入位置不合法:
4.删除:
5-1.查找成功:
5-2.查找-没有相应数据:
6-1.找到修改元素,并确定修改:
6-2.找到修改元素,不修改:
6-3.没找到修改元素:
问题讨论:
1.元素插入及删除过程中,计算机储存结构中元素位置从0开始,但面向用户时,应考虑人的自然思维,即面向用户时应以1为第一个元素位置,计算机实现需要把位置i=i+1.
注:
文件名为:
学号+(次数)