数据结构实验报告顺序表和链表.docx
《数据结构实验报告顺序表和链表.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告顺序表和链表.docx(11页珍藏版)》请在冰豆网上搜索。
![数据结构实验报告顺序表和链表.docx](https://file1.bdocx.com/fileroot1/2022-12/14/4e1ec578-9a4c-4a5e-a95f-276f838d9464/4e1ec578-9a4c-4a5e-a95f-276f838d94641.gif)
数据结构实验报告顺序表和链表
数据结构实验报告顺序表和链表
实验报告
课程名称数据结构
实验项目实验一线性表的生成与操作
题目一顺序表和链表的创建与基本操作
系别____计算机学院_______
专业____计算机大类___
班级/学号__(1406/2014011288)_____
学生姓名_______(孙文学)_________
实验日期_(2015年10月19日)
成绩_______________________
指导教师黄改娟
实验题目:
实验一线性表的生成与操作
------顺序表和链表的创建与基本操作(自己所选择实验题目,必填)
一、实验目的
1)掌握线性表的顺序存储和链式存储结构;
2)验证顺序表及链表的基本操作的实现;(验证)
3)理解算法与程序的关系,能够将算法转换为对应程序;
4)体会线性表在实际应用中能够解决的问题。
(设计、综合)
二、实验内容
1)根据实验一题目列表,选定题目,说明题目的主要需求;
2)结合所选定的题目,定义存储结构,并完成对应应用的线性表创建、插入、删除、查找等基本操作的算法描述;
3)程序编码实现,并获得运行结果。
三、报告内容
1)实验题目及主要存储结构定义
(提示:
请根据所选定题目,描述存储结构)
题目:
顺序表和链表的创建及基本操作
顺序表我是采用数组存储的,链表是采用结构体存储的
2)结合题目,说明对相应线性表的基本操作算法描述
(提示:
可用自然语言、流程图、伪代码等均可,要求对每一个操作,都给出具体的算法描述)
基本操作:
#顺序表#
(1)插入:
在线性表中的x位置插入y----将x位置及之后的元素都往后挪一位,将y的值赋给a[x].
(2)删除:
删除位置为x的元素----另y=a[x],然后x之后的元素都往前挪一位。
(3)查找:
寻找值为y的元素----从a[0]开始,若a[i]==y,则返回i,否则i++。
#链表#
(1)插入:
当i小于要插入的位置x时,i++,插入p->data------p->next=s->next;s->next=p;
(2)删除:
当p->data不等于要删除的值x时,p=p->next;
q=p->next;
p->next=q->next;
free(q);
(3)查找:
当p->data!
=x时,p=p->next,找到之后返回p->data
3)程序源码
(提示:
列出所编写程序的代码。
如果利用图形界面IDE等编程,这里只要求写出关键操作的程序代码。
此外,程序一定要有注释说明)
1.顺序表的基本操作(用数组实现)
#include
#include
intmain(){
int*a;
intN,i,j,e,x;
printf("请输入线性表长度N:
");
scanf("%d",&N);
a=(int*)malloc(N*sizeof(int));
for(i=0;ia[i]=i;
printf("初始顺序表为:
");
for(i=0;iprintf("%d",a[i]);
printf("\n");
printf("插入请输0,删除请输1,查找输入2:
");
scanf("%d",&x);
if(x==0){
printf("请输入插入位置i和数e:
");//插入
scanf("%d%d",&i,&e);
a=(int*)realloc(a,(N+1)*sizeof(int));
for(j=N-1;j>=i-1;j--)
{
a[j+1]=a[j];
}
a[i-1]=e;
for(i=0;iprintf("%d",a[i]);
printf("\n");
}
elseif(x==1){//删除
printf("请输入删除位置i:
");
scanf("%d",&i);
for(i;ia[i-1]=a[i];
for(i=0;iprintf("%d",a[i]);
printf("\n");
}
elseif(x==2){//查找
printf("请输入查找位置i:
");
scanf("%d",&i);
e=a[i-1];
printf("%d\n",e);
}
else{
printf("输入错误!
");
}
free(a);
a=NULL;
return0;
}
2.单链表的基本操作
#include
#include
#defineERROR0
#defineOK1
typedefintstatus;
typedefintElemType;
typedefstructNode
{
ElemTypedata;
structNode*next;
}LNode,*LinkList;
voidBuild(LinkListL)//建立一个带头结点的单链表
{
intn;
LinkListp,q;
p=L;
printf("请输入n:
\n");
scanf("%d",&n);
printf("请输入n个数据元素:
\n");
while(n--)
{
q=(LinkList)malloc(sizeof(LNode));
scanf("%d",&q->data);
q->next=NULL;
p->next=q;
p=q;
}
}
voidPrint(LinkListL)//计算单链表的长度,然后输出单链表
{
intnum=0;
LinkListp;
p=L->next;
while(p)
{
num++;
printf("%d",p->data);
p=p->next;
}
printf("\n长度为%d\n",num);
}
voidTips()
{
printf("按数字键选择相应操作\n");
printf("<1>输出单链表及其长度:
\n");
printf("<2>删除值为x的结点:
\n");
printf("<3>在第n个位置插入值X:
\n");
printf("<4>查找值为X的位置n:
\n");
printf("<0>退出:
\n");
}
voidDelete(LinkListL,intx)//删除值为x的结点
{
LinkListp,q;
p=L;
while(p->next&&p->next->data!
=x)
p=p->next;
if(p->next)
{
q=p->next;
p->next=q->next;
free(q);
printf("删除成功!
!
\n\n");
Print(L);
}
else
printf("链表中没有%d\n\n",x);
}
voidInsert(LinkListL,LinkListp,ElemTypee)//在第n个位置插入值X
{
LinkLists;
inti=1;
s=L;
while(i{s=s->next;i++;}
p->next=s->next;
s->next=p;
Print(L);
}
/////查找值为X的位置n
voidfind(LinkListL,inte){
intn=1;
LinkListp;
p=L;
while(p->next&&p->next->data!
=e){
p=p->next;
n++;
}
if(p->next)
printf("%d的位置是%d\n",e,n);
else
printf("不存在%d",e);
}
intmain()
{
intop,x,n;
LinkListL,p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
L->data=-1;
Build(L);
Tips();
scanf("%d",&op);
while(op)
{
switch(op)
{
case1:
Print(L);
break;
case2:
printf("请输入要查找的删除X:
\n");
scanf("%d",&x);
Delete(L,x);
break;
case3:
printf("请输入要插入的元素X和插入的位置n:
\n");
scanf("%d",&x);
scanf("%d",&n);
p=(LinkList)malloc(sizeof(LNode));
p->data=x;
Insert(L,p,n);
printf("插入成功!
!
!
\n\n");
break;
case4:
printf("请输入要查找的元素X:
\n");
scanf("%d",&x);
find(L,x);
}
Tips();
scanf("%d",&op);
}
return0;
}
4)运行结果
(提示:
运行结果要求能反应每一种操作前后的结果变化情况)
1.
顺序表
2.链表
四、总结与心得
实验完成后的总结与思考,或者谈收获。
(注意此部分要结合自己的题目来阐述说明)
学会了线性表和单链表的创建与基本操作,实验中对顺序表存储方面不太熟练,所以我用数组存储的顺序表。