数据结构与算法实验线性表.docx
《数据结构与算法实验线性表.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验线性表.docx(15页珍藏版)》请在冰豆网上搜索。
![数据结构与算法实验线性表.docx](https://file1.bdocx.com/fileroot1/2023-1/29/b29b35cc-c92f-498d-84db-854f34387f5f/b29b35cc-c92f-498d-84db-854f34387f5f1.gif)
数据结构与算法实验线性表
沈阳工程学院
学生实验报告
(课程名称:
数据结构与算法)
实验题目:
线性表
班级网本112班学号2011414217姓名樊鹏鹏
地点F606指导教师吕海华、祝世东
实验日期:
2012年9月27日
一、实验目的
1.了解线性表的逻辑结构特性,以及这种特性在计算机内的两种存储结构。
2.掌握线性表的顺序存储结构的定义及其C语言的实现。
3.掌握线性表的链式存储结构——单链表的定义及其C语言的实现。
4.掌握线性表的基本操作
二、实验环境
TurboC或是VisualC++
三、实验内容与要求
实验1顺序表的操作
请编制C程序,利用顺序存储方式来实现下列功能:
根据键盘输入数据建立一个线性表,并输出该线性表;然后根据屏幕菜单的选择,可以进行表的创建,数据的插入删除并在插入和删除数据后再输出线性表;最后在屏幕菜单中选择0,即可结束程序的运行。
分析:
当我们要在顺序表的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素一次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
当要删除第i个元素时,也只需将第i个元素之后的所有元素前移一个位置。
算法描述:
对每个算法,都要写出算法的中文描述。
本实验中要求分别写出在第i个(从1开始计数)结点前插入数据为x的结点、删除指定结点、创建一个线性表。
打印线性表等的算法描述。
实验2单链表的操作
请编制C程序,利用链式存储方式来实现线性表的创建、插入、删除和查找等操作。
具体地说,就是要根据键盘输入的数据建立一个单链表;然后根据屏幕菜单的选择,可以进行数据的插入或删除,并在插入或删除数据后,再输出单链表;最后在屏幕菜单中选择0,即可结束程序的运行。
算法描述:
本实验要求分别写出在单链表中第i(从1开始计数)个位置之后插入元素、创建单链表、在单链表中删除第i个位置的元素、顺序输出单链表的内容等的算法描述。
四、实验过程及结果分析
顺序表:
#include
#include
#defineSIZE100
intL=0;
structnumber
{
longnum;
};
/*------------------创建顺式线性表------------------*/
structnumber*creat(void)
{
structnumber*head,*p1;
p1=head=(structnumber*)malloc(SIZE*sizeof(structnumber));
scanf("%ld",&p1->num);
for(;p1->num!
=0;L++)
{
p1++;
scanf("%ld",&p1->num);
}
return(head);
}
/*------------------输出顺式线性表中的元素------------------*/
voidprint(structnumber*head)
{
structnumber*p;
ints=L;
p=head;
if(p!
=0)
{
printf("\n您输入的数据为:
\n");
for(;s>0;p++,s--)
printf("%ld",p->num);
}
}
/*------------------查找顺式线性表中的元素------------------*/
voidsearch(structnumber*head)
{
structnumber*p;
longnum1;
intn=0,s=0;
p=head;
printf("\n请输入您要查找的数据:
\n");
scanf("%ld",&num1);
if(head!
=0)
for(;p->num!
=0;p++)
{
n++;
if(p->num==num1)
{
s=1;
break;
}
}
if(s==0)
printf("\n没有您所要查找的数据\n");
else
printf("\n找到您所需数据'%ld'在表中第%d个\n",num1,n);
}
/*------------------插入顺式线性表的元素------------------*/
structnumber*insert(structnumber*head)
{
structnumber*p1,*p2;
intn=1;
longnum1;
p1=p2=head;
p2=p2+L-1;
printf("\n请输入您要插入的数据:
\n");
scanf("%ld",&num1);
if(num1num)
{
for(p1=head;p1->numn++;
for(;p2>=p1;p2--)
(p2+1)->num=p2->num;
}
(p2+1)->num=num1;
L++;
return(head);
}
/*------------------删除顺式线性表的元素------------------*/
structnumber*del(structnumber*head)
{
structnumber*p1,*p2;
longnum1;
intn=1;
p1=p2=head;
printf("\n请输入要删除的数据:
\n");
scanf("%ld",&num1);
p2=p2+L-1;
for(;p1->num!
=num1&&n<=L;p1++)
n=n+1;
if(n>L)
{
printf("\n没有您要删除的数据\n");
return(0);
}
else
{
for(;p1<=p2;p1++)
p1->num=(p1+1)->num;
L--;
return(head);
}
}
voidmain()
{
structnumber*head,*head1,*head2;
inta;
/*head=creat();
print(head);*/
printf("\n************************************\n");
printf("按1:
创建\n");
printf("按2:
插入\n");
printf("按3:
查找\n");
printf("按4:
删除\n");
printf("按5:
输出\n");
printf("按0:
退出\n");
printf("*************************************\n");
scanf("%d",&a);
while(a!
=0)
{
switch(a)
{
case1:
printf("请创建顺序表:
");head=creat();break;
case2:
head1=insert(head);break;
case3:
search(head);break;
case4:
head2=del(head);break;
case5:
print(head);
case0:
break;
}
printf("\n继续操作请输入,否则请按0退出:
\n");
scanf("%d",&a);
}
}
图1
图2
链表:
#include"stdio.h"
#include"malloc.h"
typedefstructnode
{
intdata;
structnode*next;
}LNode,*LinkList;
intlen;
/*------------------创建链式线性表------------------*/
LinkListCreatLink()
{
intx,count=0;
LinkListp,q,h;
h=NULL;
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&x);
p->data=x;
p->next=NULL;
while(x!
=0)
{
count++;
if(count==1)
q=h=p;
else
{
q->next=p;
q=p;
}
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&x);
p->data=x;
p->next=NULL;
}
returnh;
}
/*------------------删除链式线性表的元素------------------*/
LinkListdel(LinkListh,intdata)
{
LinkListp1,p2;
if(h==NULL)
{
printf("\nlistnull!
\n");
returnh;
}
p1=h;
while(data!
=p1->data&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(data==p1->data)
{
if(p1==h)
h=p1->next;
elsep2->next=p1->next;
printf("delete:
%ld\n",data);
len=len-1;
}
elseprintf("%ldnotbeenfound!
\n",data);
return(h);
}
/*------------------输出链式线性表的元素------------------*/
voidPrintLink(LNode*h)
{
LNode*p;
p=h;
while(p!
=NULL)
{
printf("%d",p->data);
p=p->next;
}
}
/*------------------计算链式线性表的长度------------------*/
intLinkLen(LinkListh)
{
LinkListp=h;
intcount=0;
while(p!
=NULL)
{
count++;
p=p->next;
}
returncount;
}
/*------------------查找链式线性表中的元素------------------*/
LinkListQueryLink(LinkListh,intx)
{
LinkListq,p;
q=p=h;
while(p!
=NULL)
{
if(p->data==x)
break;
else
{
q=p;
p=p->next;
}
}
if(p!
=NULL)
returnq;
else
returnNULL;
}
/*------------------向链式线性表插入元素------------------*/
LinkListInsertLink(LinkListh,inti,intx)
{
LinkListp,q;
intj;
p=(LinkList)malloc(sizeof(LNode));
p->data=x;
if(i==0)
{
p->next=h;
h=p;
}
else
{
q=h;
j=1;
while(q!
=NULL&&j
{
j++;
q=q->next;
}
if(q!
=NULL)
{
p->next=q->next;
q->next=p;
}
else
printf("nofound\n");
}
returnh;
}
voidmain()
{
LinkListh,p;
intx,a;
printf("请按菜单进行操作!
\n");
printf("********************\n");
printf("按1:
创建链表\n");
printf("按2:
插入元素\n");
printf("按3:
链表长度\n");
printf("按4:
查找元素\n");
printf("按5:
删除元素\n");
printf("按6:
输出链表\n");
printf("按0:
退出运行\n");
printf("********************\n");
printf("请选择操作:
");
scanf("%d",&a);
while(a!
=0)
{
switch(a)
{
case1:
printf("请输入:
");h=CreatLink();printf("创建链表成功!
");break;
case2:
printf("请输入要插入的元素:
");scanf("%d",&x);h=InsertLink(h,1,x);break;
case3:
len=LinkLen(h);printf("该链表的长度为:
%d",len);break;
case4:
printf("请输入要查找的元素:
");scanf("%d",&x);p=QueryLink(h,x);
if(p!
=NULL)
printf("find=%d\n",p->next->data);
else
printf("nofound\n");break;
case5:
printf("\n请输入要删除的元素:
");
scanf("%d",&x);
if(x!
=0)
h=del(h,x);break;
case6:
printf("输出链表:
");PrintLink(h);break;
case0:
break;
}
printf("\n继续操作请选择,退出请安0\n");
scanf("%d",&a);
}
}
图3
图4
五、成绩评定
优
良
中
及格
不及格
出勤
内容
格式
创新
效果
总评
指导教师:
年月日