创建链表和链表操作实验报告Word文档格式.docx
《创建链表和链表操作实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《创建链表和链表操作实验报告Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
structLNond*next;
}LNode*LinkList;
2.单链表的插入操作:
StatusListTnsert-L(LinkLIst&
L,inti,ElemTypee){
//再带头结点的单链线性表L中的第i个位置之前插入
元素eP=l;
j=0;
While(p&
&
jnext;
++j;
}//寻找第i-1个结点
if(!
p||j>
i-1)returnERROR;
//i小小于1或者大于表长+1s=(LinkList)malloc(sizeof(LNode));
//
生成新结点s->
date=e;
s->
next=p->
next;
//插入L中
p->
next=s;
returnok;
}//ListTnsertL
3.单链表的删除操作:
StatusListDelete-L(LinkLlst&
L,inti,ElemType&
e){
//在带头结点单链线性表L中,删除低i个元素,并e返
回其值p=l;
while(p->
next&
++j;
}
(p->
next)||j>
i-1)
returnERROR;
//删除位置不合理
删除并释放结点
q=p->
next;
p->
next=q->
next;
e=q->
datefree(q);
returnOK;
}//ListDelete-L
4.链表的合并操作:
voidMergeList-L(LinkList&
La,LinkList&
Lb,
LinkList&
Lc){//已知单链表La和Lb的元素值
//合并单链表La和Lb,得到新的单链表Lcpa=La->
pb=Lb->
lc=pc=La;
//用La的头结点作为Lc的头结点while(pa&
pb){if(pa->
datedate){
pc->
next=pa;
pc=pa;
pa=pa->
else{pc->
next=pb;
pc=pb;
pb=pb->
}}
Pc->
next=papa:
pb;
//插入剩余段free(Lb);
//释
放Lb头结点
}//MergeList-L四、详细设计:
#include#include#include#includetypedef
intstatus;
typedefcharElemType;
typedefstructLnode
{ElemTypedata;
//定义链表结点类型
structLnode*next;
}Lnode,*Linklist;
statusinitlist(Linklist*L){//单链表
的初始化*L=(Lnode*)malloc(sizeof(Lnode));
//创
建头结点(*L)->
next=NULL;
return1;
statusCreatelist(LinklistL){Lnode*p,*q;
inti,j=1,n;
ElemTypem,M;
q=L;
请输入你要输入单链中元素的个数\\n\
{p=(Lnode*)malloc(sizeof(Lnode));
请输入%个元素:
\scanf(\
j++;
return1;
statusListinsert(Linklist
{intj=0;
输入错误!
\\n\return
0;
s=(Lnode*)malloc(sizeof(Lnode));
data=e;
//创建自己规定长度的单链表//回车缓冲区//回车
缓冲区//向单链表指定位置插入一个元素
s->
statusListdelete(LinklistL,inti,ElemType*e)
{//删除单链表指定位置的元素,返回删除后的。
链表元
素Lnode*p,*q;
intj=0;
p=L;
j++;
输入错误!
\\n\
return0;
}q=p->
*e=q->
data;
free(q);
return
1;
voidprint(LinklistL){//输出单链表中的元素
Linklistp;
p=L->
输出单链表:
\\n\while(p!
=NULL)
{printf(\p=p->
printf(\}
structLnode*inter_link(structLnode*chainl,
inta,structLnode*chain2,intb){//单链表
的合并inttemp;
structLnode*head,*p1,*p2,*p3;
//判断a,b
大小并合并
if(a>
=b){
head=
pl=
chainl;
p2=
=chain2;
}
else{
chain2;
=chainl;
temp=
a,a
=b,b=temp;
p3=head;
while(p2!
=NULL){
pl=p1->
p3->
next=p2;
p3=p2;
p2=p2->
next=p1;
p3=p1;
returnhead;
main{
inti,n,a,b,h;
structLnode*p1,*p2;
ElemTypee;
请输入创建的链表的个数:
switch(n){
case1:
{LinklistL;
initlist(&
L);
/*创建链表*/Createlist(L);
print(L);
/*插入元素*/
请输入需要插入元素的值和位置\\n\
Listinsert(L,i,e);
请输入需要插入元素的值和位置
scanf(\
print(L);
\\n\scanf(\
/*删除元素*/
请输入要删除的元素的位置:
Listdelete(L,i,&
e);
被删除元素为:
%ld\\n\};
break;
case2:
Createlist(H);
print(H);
L=inter_link(L,a,H,b);
合并后的链表:
\\n:
\
};
default:
printf(\}}
五、调试分析及测试结果:
测试数据:
1.;
2.在5之前插入4,7,并删除11
求集合{1,12,8,6,4,9}和{2,5,12,7,4}的并
集
测试结果及分析:
1.运行程序,首先进入选择界面,选择输入需要创建的
链表数为1个,输入单链表中的元素个数为六个。
按照操作要求一次输入六个元素3,9,5,6,11,8。
按回车键结束,此时程序输出单链表,单链表创建成功。
图1:
单链表的创建与输出
2.当程序弹出“请输入需要插入元素的值和位置时”执
行单链表的插入操作。
按要求输入需要4,插入元素的值“4”
和元素的位置“3”,按回车结束,重新输出单链表,插入成功。
图2:
单链表的插入操作3.进行删除操作,根据提示输入删除元素的位置“7”,输出单链表后,第七个语速消失,
元素删除成功。
图3:
单链表的删除操作
4.单链表的合并:
再一次运行程序,选择需要创建链表的个数为2个。
按照提示一次输入两个单链表的元素个数和元素值;
按回车键结束,此时进行两个单链表的合并操作,输入合并后的链表。
图4:
链表的合并
六、实验心得及经验教训:
于c语言没学好,刚开始做实验时感到无从下手,根本不知道怎样去写源代码。
后来通过参考书籍和上网查阅资料,依样画葫芦的弄出了代码,但在程序上一编译,出现了很多错误,根本就不能运行。
在编译器的中找到出错的地方,一个个的去改正,有些是于粗心造成的,有些是因为没有定义造成的。
最常见的就是漏掉“;
”和大小写不分。
但有些程序改了好几遍的都该不过来,这就需要不断的去尝试,againandagain,虽然心里会觉得很烦,但改出来,就会
有一种成就感,并非得不偿失。
通过本次实验,我知道了写程序是一个循序渐进的过程,并不能一口就吃一个胖子;
其次,还要又足够的耐心。
当然,扎实的专业知识是少不了的,因此,上课要认真听讲,课外要花点时间巩固提高。
这样,做实验写程序时就不会手忙脚乱!
teypedefstructLNode{ElemTypedate;
StatusListTnsert-L(LinkLlst&
StatusListDelete-L(LinkLIst&
//合并单链表La和Lb,得到新的单链表Lcpa=La->
}Lnode,*Linklist;
statusinitlist(Linklist*L)
{
//单链表
创
Lnode*p,*q;
statusCreatelist(LinklistL){
scanf(\p->
data=M;
q->
next=p;
q=p;
L,inti,ElemTypee)
Lnode*p=L,*s;
while(p&
缓冲区//向单链表指定位置插入一个元素s->
j++;
1;
//判断a,b
大小并合并if(a>
head=pl=chainl;
p2=chain2;