数据结构与算法实验报告线性表.docx
《数据结构与算法实验报告线性表.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验报告线性表.docx(14页珍藏版)》请在冰豆网上搜索。
![数据结构与算法实验报告线性表.docx](https://file1.bdocx.com/fileroot1/2022-11/27/17df18a7-8b9a-4856-b6b2-2c284b41c054/17df18a7-8b9a-4856-b6b2-2c284b41c0541.gif)
数据结构与算法实验报告线性表
沈阳工程学院
学生实验报告
〔课程名称:
数据构造与算法〕
实验题目:
线性表
班级学号姓名
地点指导教师
实验日期:
年月日
一、实验目的
1.理解线性表的逻辑构造特性,以及这种特性在计算机内的两种存储构造。
2.掌握线性表的顺序存储构造的定义及其C语言的实现。
3.掌握线性表的链式存储构造——单链表的定义及其C语言的实现。
4.掌握线性表的根本操作
二、实验环境
TurboC或是VisualC++
三、实验内容与要求
实验1顺序表的操作
请编制C程序,利用顺序存储方式来实现以下功能:
根据键盘输入数据建立一个线性表,并输出该线性表;然后根据屏幕菜单的选择,可以进展表的创立,数据的插入删除并在插入和删除数据后再输出线性表;最后在屏幕菜单中选择0,即可完毕程序的运行。
分析:
当我们要在顺序表的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素一次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
当要删除第i个元素时,也只需将第i个元素之后的所有元素前移一个位置。
算法描绘:
对每个算法,都要写出算法的中文描绘。
本实验中要求分别写出在第i个〔从1开始计数〕结点前插入数据为x的结点、删除指定结点、创立一个线性表。
打印线性表等的算法描绘。
实验2单链表的操作
请编制C程序,利用链式存储方式来实现线性表的创立、插入、删除和查找等操作。
详细地说,就是要根据键盘输入的数据建立一个单链表;然后根据屏幕菜单的选择,可以进展数据的插入或删除,并在插入或删除数据后,再输出单链表;最后在屏幕菜单中选择0,即可完毕程序的运行。
算法描绘:
本实验要求分别写出在单链表中第i〔从1开始计数〕个位置之后插入元素、创立单链表、在单链表中删除第i个位置的元素、顺序输出单链表的内容等的算法描绘。
四、实验过程及结果分析
实验1顺序表的操作
#defineTURE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#include
#include
#defineML1//线性表
#defineTURE1
#defineFALSE0
#defineOK1
#defineERR0
typedefstruct
{
intlist[ML];
intsize;
intMAXSIZE;
}sqList;
sqList*Init_List(sqList*L,intms);
voidDisp_List(sqList*L);
intLocateElem_List(sqList*L,intx);
intInsert_List(sqList*L,intx,intmark);
intDelete_List1(sqList*L,intitem);
intDelete_List2(sqList*L,intmark);
sqList*Init_List(sqList*L,intms){
L=(sqList*)malloc(ms*sizeof(sqList));
if(!
L){
printf("Memoryallocationfailure\n");
exit(OVERFLOW);
}
else
L->size=0;
L->MAXSIZE=ms;
returnL;
}
voidDisp_List(sqList*L){
inti;
for(i=0;isize;i++)
printf("%d",L->list[i]);
printf("\n");
}
intLocateElem_List(sqList*L,intx){
inti=0;
for(i=0;i<=L->size;i++)
if(L->list[i]==x)
returni;
if(i>L->size)
return-1;
}
intInsert_List(sqList*L,intx,intmark){
inti=1;
if(L->size>=L->MAXSIZE)
return-1;
if(mark>0){
for(i=L->size+1;i>=mark;i--)
L->list[i+1]=L->list[i];
L->list[i]=x;
}
elseif(mark<0)
L->list[L->size]=x;
L->size++;
returnFALSE;
}
intDelete_List1(sqList*L,intitem){
inti,j;
for(i=0;isize;i++)
if(item==L->list[i])
break;
if(isize){
for(j=i+1;jsize-1;j++)
L->list[j]=L->list[j+1];
L->size--;
returni;
}
returnFALSE;
}
intDelete_List2(sqList*L,intmark){
inti,item;
if(mark>0){
item=L->list[mark];
for(i=mark+1;isize-1;i++)
L->list[i]=L->list[i+1];
L->size--;
returni;
}
returnFALSE;
}
voidmain(){
intp,n,x=0;
sqLista,*b;
b=Init_List(&a,ML);
printf("listaddr=%d\tsize=%d\tMaxSize=%d",b->list,b->size,b->MAXSIZE);
while
(1){
printf("\n请输入值,0为完毕输入:
");
scanf("%d",&x);
if(!
x)break;
printf("请输入插入位置:
");
scanf("%d",&p);
Insert_List(b,x,p);
printf("线性表为:
\n");
Disp_List(b);
}
while
(1){
printf("请输入查找值,输入0完毕查找操作:
");
scanf("%d",&x);
if(!
x)break;
n=LocateElem_List(b,x);
if(n<0)printf("没找到\n");
else
printf("又符合条件的值,位置为:
%d\n",n+1);
}
while
(1){
printf("请输入删除值,输入0完毕查找操作:
");
scanf("%d",&x);
if(!
x)break;
n=Delete_List1(b,x);
if(n<0)
printf("没找到\n");
else{
printf("删除成功,线性表为:
");
Disp_List(b);
}
}
while
(1){
printf("请输入删除值位置,输入o完毕查找操作:
");
scanf("%d",&p);
if(!
p)break;
n=Delete_List2(b,p);
if(p<0)printf("位置越界\n");
else{
printf("线性表为:
");
Disp_List(b);
}
}
}
实验2单链表的操作
#include
#include
#definenull0
typedefintElemType;/*字符型数据*/
structLNode
{
ElemTypedata;
structLNode*next;
};
voidsetnull(structLNode**p);
intlength(structLNode**p);
ElemTypeget(structLNode**p,inti);
voidinsert(structLNode**p,ElemTypex,inti);
voiddele(structLNode**p,inti);
voiddisplay(structLNode**p);
intlocate(structLNode**p,ElemTypex);
voidmain()
{
structLNode*head,*q;/*定义静态变量*/
intselect,x1,x2,x3,x4;
inti,n;
intm,g;
chare,y;
setnull(&head);/*建立链表并设置为空表*/
printf("请输入数据长度:
");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("将数据插入到单链表中:
");
scanf("%d",&y);
insert(&head,y,i);
}/*插入数据到链表*/
display(&head);/*显示链表所有数据*/
printf("select1求长度length()\n");
printf("select2取结点get()\n");
printf("select3求值查找locate()\n");
printf("select4删除结点delete()\n");
printf("select0退出\n");
printf("inputyourselect:
");
scanf("%d",&select);
while(select!
=0)
{switch(select)
{
case1:
{
x1=length(&head);
printf("输出单链表的长度%d",x1);
display(&head);
}break;
case2:
{
printf("请输入要获得结点:
");
scanf("%d",&m);
x2=get(&head,m);
printf("%d",x2);
display(&head);
}break;
case3:
{
printf("请输入要查找的数据:
");
scanf("%d",&e);
x3=locate(&head,e);
printf("%d",x3);
display(&head);
}break;
case4:
{
printf("请输入要删除的结点:
");
scanf("%d",&g);
dele(&head,g);
display(&head);
}break;
}
printf("select1求长度length()\n");
printf("select2取结点get()\n");
printf("select3求值查找locate()\n");
printf("select4删除结点delete()\n");
printf("select0退出\n");
printf("inputyourselect:
");
scanf("%d",&select);
}
}
voidsetnull(structLNode**p)
{
*p=null;
}
intlength(structLNode**p)
{
intn=0;
structLNode*q=*p;
while(q!
=null)
{
n++;
q=q->next;
}
return(n);
}
ElemTypeget(structLNode**p,inti)
{
intj=1;
structLNode*q=*p;
while(j
=null)
{
q=q->next;
j++;
}
if(q!
=null)
return(q->data);
else
{printf("位置参数不正确!
\n");
return0;}
}
intlocate(structLNode**p,ElemTypex)
{
intn=0;
structLNode*q=*p;
while(q!
=null&&q->data!
=x)
{
q=q->next;
n++;
}
if(q==null)
return(-1);
else
return(n+1);
}
voidinsert(structLNode**p,ElemTypex,inti)
{
intj=1;
structLNode*s,*q;
s=(structLNode*)malloc(sizeof(structLNode));
s->data=x;
q=*p;
if(i==1)
{
s->next=q;
*p=s;
}
else
{
while(jnext!
=null)
{
q=q->next;
j++;
}
if(j==i-1)
{
s->next=q->next;
q->next=s;
}
else
printf("位置参数不正确!
\n");
}
}
voiddele(structLNode**p,inti)
{
intj=1;
structLNode*q=*p,*t;
if(i==1)
{
t=q;
*p=q->next;
}
else
{
while(jnext!
=null)
{
q=q->next;
j++;
}
if(q->next!
=null&&j==i-1)
{
t=q->next;
q->next=t->next;
}
else
printf("位置参数不正确!
\n");
}
if(t!
=null)
free(t);
}
voiddisplay(structLNode**p)
{
structLNode*q;
q=*p;
printf("单链表显示:
");
if(q==null)
printf("链表为空!
");
elseif(q->next==null)
printf("%d\n",q->data);
else
{
while(q->next!
=null)
{
printf("%d->",q->data);
q=q->next;
}
printf("%d",q->data);
}
printf("\n");
}
五、成绩评定
优
良
中
及格
不及格
出勤
内容
格式
创新
效果
总评
指导教师:
年月日