数据结构课程单链表实验报告.docx
《数据结构课程单链表实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程单链表实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
![数据结构课程单链表实验报告.docx](https://file1.bdocx.com/fileroot1/2023-4/20/8f6e7a97-c4b0-490b-b460-229d4f52eddf/8f6e7a97-c4b0-490b-b460-229d4f52eddf1.gif)
数据结构课程单链表实验报告
郑州轻工业学院
《数据结构》课程实验
实验报告
题目:
单链表表的基本操作及c语言实现
专业:
信息管理与信息系统
班级:
11-01
**********
完成日期:
2013/5/23
一、试验内容
用c语言实现单链表的建立插入删除查找,合并等内容
二、试验目的
掌握链表的基本操作:
插入、删除、查找等运算,能够灵活应用链表这种数据结构,深入对链表链式结构的了解。
三.源程序代码
#include
#include
typedefintElemtype;
typedefintStatus;
typedefstructnode//定义存储节点
{
intdata;//数据域
structnode*next;//结构体指针
}*linklist,node;//结构体变量,结构体名称
linklistcreat(intn)//创建单链表
{
linklisthead,r,p;//定义头指针r,p,指针
intx,i;
head=(node*)malloc(sizeof(node));//生成头结点
r=head;//r指向头结点
printf("输入数字:
\n");
for(i=n;i>0;i--)//for循环用于生成第一个节点并读入数据
{
scanf("%d",&x);
p=(node*)malloc(sizeof(node));
p->data=x;//读入第一个节点的数据
r->next=p;//把第一个节点连在头结点的后面
r=p;//循环以便于生成第二个节点
}
r->next=0;//生成链表后的断开符
returnhead;//返回头指针
}
voidoutput(linklisthead)//输出链表
{
linklistp;
p=head->next;
do
{
printf("%3d",p->data);
p=p->next;
}
while(p);
printf("\n");
}
Statusinsert(linklist&l,inti,Elemtypee)//插入操作
{
intj=0;
linklistp=l,s;
while(j{
p=p->next;
++j;
}
if(!
p||j>i-1)
return-1;
else
{
s=(node*)malloc(sizeof(node));
s->data=e;
s->next=p->next;
p->next=s;
return1;
}
}
Statusdelect(linklist&l,inti,Elemtype&e)//删除操作
{
intj=0;
linklistp=l,q;
while(jnext)
{
p=p->next;
++j;
}
if(!
p->next||j>i-1)
return-1;
else
{
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return1;
}
}
voidcombine(linklistla,linklistlb)//合并单链表
{
node*pa,*pb,*pc;
linklistlc;
pa=la->next;
pb=lb->next;
lc=pc=la;
while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{pc->next=pb;pc=pb;pb=pb->next;}
}
pc->next=pa?
pa:
pb;
free(lb);
}
StatusGetElem(linklistl,inti,Elemtype&e)//查找操作
{
linklistp;
intj;
p=l->next;
j=1;
while(p&&j
{
p=p->next;
++j;
}
if(!
p||j>i)
return-2;
e=p->data;
returne;
}
voidmain()
{
linklistla,lb;
intn;
inti,j;
Elemtypee;
printf("请输入第一个链表:
\n");
printf("输入链表元素的个数:
\n");
scanf("%d",&n);
la=creat(n);
printf("输出链表:
\n");
output(la);
printf("请输入要查找元素的位置:
\n");
scanf("%d",&i);
j=GetElem(la,i,e);
printf("所要查找的元素是%d\n",j);
printf("请输入插入位置和元素:
\n");
scanf("%d%d",&i,&e);
insert(la,i,e);
printf("插入后的链表:
\n");
output(la);
printf("请输入要删除的位置:
\n");
scanf("%d",&i);
delect(la,i,e);
printf("删除的那个元素是:
%d\n",e);
printf("输出删除后的顺序表:
\n");
output(la);
printf("请输入第一个非递减链表:
\n");
printf("输入链表元素的个数:
\n");
scanf("%d",&n);
la=creat(n);
printf("输出链表:
\n");
output(la);
printf("请输入第二个非递减链表:
\n");
printf("输入链表元素的个数:
\n");
scanf("%d",&n);
lb=creat(n);
printf("输出链表:
\n");
output(lb);
combine(la,lb);
printf("输出合并后的链表:
\n");
output(la);
}
运行结果如下:
六、结果分析与思考
关于单链表的建立要比顺序表难懂,单链表的建立有头插法和尾插法两种,我选用的是尾插法,尾插法较之头插法更为简单和使用,一定要熟练使用。