3数据结构实验链表答案要点Word文件下载.docx
《3数据结构实验链表答案要点Word文件下载.docx》由会员分享,可在线阅读,更多相关《3数据结构实验链表答案要点Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
2.掌握线性链表的建立、插入和删除等方法。
3.掌握线性链表的基本算法。
总
结
一、程序:
#include"
stdio.h"
stdlib.h"
typedefcharelemtype;
typedefstructnode{
elemtypedata;
structnode*next;
}NODE,*NODEPTR;
NODEPTRcreatelistf()
{charch;
NODEPTRhead;
NODE*p;
head=(NODEPTR)malloc(sizeof(NODE));
head->
next=0;
ch=getchar();
while(ch!
='
\n'
)
{p=(NODE*)malloc(sizeof(NODE));
p->
data=ch;
next=head->
next;
next=p;
}
return(head);
intInsLinkList(NODE*p,charx)
{
NODE*s;
/*定义指向结点类型的指针*/
s=(NODE*)malloc(sizeof(NODE));
/*生成新结点*/
s->
data=x;
next=p->
next=s;
return1;
}
voidDelLinkList(NODE*p)
{NODE*q;
if(p->
next!
=0)
{q=p->
/*q指向p的后继结点*/
next=q->
/*修改p结点的指针域*/
free(q);
}/*删除并释放结点*/
NODE*lbcz(NODE*h,intx)
{NODE*p;
p=h;
while(p!
=0&
&
data!
=x)p=p->
return(p);
voidprintlink(NODE*h)
{NODE*p;
p=h->
printf("
\n"
);
while(p!
{printf("
%c"
p->
data);
p=p->
printf("
voidmain()
{NODE*h,*p;
charx;
\n头插法建立单链表,应包含字符a,以回车作为结束符\n"
h=createlistf();
\n建立的单链表为\n"
printlink(h);
\n在链表中查找字符a\n"
p=lbcz(h,'
a'
\n将字符k插入到字符a后面\n"
InsLinkList(p,'
k'
\n插入字符后的链表为\n"
\n输入链表中被删除字符的前一个字符\n"
scanf("
&
x);
p=lbcz(h,x);
\n删除该字符后的一个字符\n"
DelLinkList(p);
\n删除字符后的链表为\n"
二、源代码以及输入数据输出结果为:
typedefintelemtype;
{intch;
scanf("
%d"
ch);
intInsLinkList(NODE*h,intx)
NODE*s,*q,*p;
q=p;
while(p->
=NULL&
data<
x)
{q=p;
p=p->
s=(NODE*)malloc(sizeof(NODE));
q->
%d"
}
{NODE*h;
用头插法建升序链表,注意输入数字的顺序与得到顺序相反,以0作为结束\n"
建立的链表为"
InsLinkList(h,55);
插入后的链表为"
运行情况为:
三、已知单链表L,写一算法,删除其重复结点。
算法思路:
用指针p指向第一个数据结点,从它的后继结点开始到表的结束,找与其值相同的结点并删除之;
p指向下一个;
依此类推,p指向最后结点时算法结束。
源程序如下:
头插法建立链表\n"
请输入字符串,以回车键结束:
"
voiddeLinkList(NODEPTRH)
{NODE*p,*q,*r;
p=H->
//p指向第一个结点
=NULL)
{q=p;
while(q->
=NULL)//从*p的后继开始找重复结点
{if(q->
next->
data==p->
data)
{r=q->
//找到重复结点,用r指向,删除*r
q->
next=r->
free(r);
}
elseq=q->
}//while(q->
next)
//p指向下一个,继续
}//while(p->
voidplink(NODE*h)
NODE*p;
plink(h);
deLinkList(h);
删除了重复结点的链表为"
四、设有两个单链表A、B,其中元素递增有序,编写算法将A、B归并成一个按元素值递减(允许有相同值)有序的链表C,要求用A、B中的原结点形成,不能重新申请结点。
typedefstructnode
NODEPTRcreatelistf()//使用尾插法建立线性链表
{intx;
NODEPTRhead,r;
r=head;
//r作为尾指针
请输入整型数据到线性表中,以-1作为结束符\n"
while(x!
=-1)//使用-1作为输入结束符
r->
r=p;
NODEPTRmerge(NODEPTRA,NODEPTRB)//线性链表的合并
{NODEPTRC;
NODE*p,*q,*s;
p=A->
q=B->
C=A;
//C表的头结点
C->
next=NULL;
free(B);
while(p&
q)
{if(p->
q->
{s=p;
else
{s=q;
q=q->
}//从原AB表上摘下较小者
next=C->
//插入到C表的头部
}//while
if(p==NULL)p=q;
while(p)//将剩余的结点一个个摘下插入到C表的头部*/
returnC;
voidplink(NODE*h)//线性链表的输出
%d"