单链表.docx
- 文档编号:24583126
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:18
- 大小:17.05KB
单链表.docx
《单链表.docx》由会员分享,可在线阅读,更多相关《单链表.docx(18页珍藏版)》请在冰豆网上搜索。
单链表
数据结构上机实验一
实验内容:
单链表的基本操作
实验要求:
1)链表的显示要作为函数被调用.
2)把自己使用的单链表结构明确的表达出来.
3)要求都是带头结点的单链表.
4)基本上实现每个实验题目的要求.
分组要求:
可单独完成,也可两人一组。
实验目的:
1)熟悉C/C++基本编程,培养动手能力.
2)通过实验,加深对链表的理解.
评分标准:
1)只完成第一题得3分;
2)完成一、二题得4分;
3)完成第三题得5分;
4)完成第四题得6分;
5)完成第五题得7分
题目(共有四个,第一二三题必做,第四题选做):
一)建立单链表+求长度+显示(完成此题最多得3分)
(1)由键盘一个一个的输入正整数,建立相应的链表,输入-1时,链表结束;
(2)求
(1)中创建的链表的长度;
(3)把链表中的数据按照先后顺序显示(要求在显示器可见);
#include
#include
typedefchardatatype;
typedefstructnode
{
datatypedata;
structnode*next;
}listnode;
typedeflistnode*linklist;
voidmain()
{
linklistcreatlist();
voidprintlist(linklist);
linklistlistadd(linklist,linklist);
linklistla=creatlist();
linklistlb=creatlist();
//printlist(la);
//printlist(lb);
linklistlc=listadd(la,lb);
printlist(lc);
}
linklistcreatlist()//创建单链表
{
charch;
linklisthead=(linklist)malloc(sizeof(listnode));
linklistp,q;
q=head;
while((ch=getchar())!
='\n')
{
p=(linklist)malloc(sizeof(listnode));
p->data=ch;
q->next=p;
q=p;
}
q->next=NULL;
returnhead;
}
voidprintlist(linklisthead)//输出单链表
{
linklistp;
for(p=head->next;p;p=p->next)
printf("%c",p->data);
printf("\n");
}
linklistlistadd(linklistla,linklistlb)//两链表合并
{
linklistpb,pa,p,q;
linklisthead=(linklist)malloc(sizeof(listnode));
q=head;
for(pa=la->next,pb=lb->next;pa&&pb;)
{
if(pa->data>pb->data)
{
p=(linklist)malloc(sizeof(listnode));
p->data=pb->data;
q->next=p;
q=p;
pb=pb->next;
}
elseif(pa->data
{
p=(linklist)malloc(sizeof(listnode));
p->data=pa->data;
q->next=p;
q=p;
pa=pa->next;
}
else
{
p=(linklist)malloc(sizeof(listnode));
p->data=pb->data;
q->next=p;
q=p;
pb=pb->next;
pa=pa->next;
}
if(pa==NULL&&pb!
=NULL)
{
while(pb!
=NULL)
{
p=(linklist)malloc(sizeof(listnode));
p->data=pb->data;
q->next=p;
q=p;
pb=pb->next;
}
}
if(pa!
=NULL&&pb==NULL)
{
while(pa!
=NULL)
{
p=(linklist)malloc(sizeof(listnode));
p->data=pa->data;
q->next=p;
q=p;
pa=pa->next;
}
}
}
q->next=NULL;
returnhead;
}
二)查找+插入+删除+显示
在题目
(一)的单链表中:
(4)查找单链表中的第k个元素;
(5)在链表中第k个位置之前插入新的数据元素,显示该链表;
(6)删除第i个元素,输出该元素并显示链表;
#include
#include
#include
#include
#include
typedefstructLNode
{
intnumber;
structLNode*next;
}LNode,*LinkList;
LinkListCreateList()/*建立单链表*/
{
LinkListp,q,L;
L=(LinkList)malloc(sizeof(LNode));
if(!
L)exit(0);
q=(LinkList)malloc(sizeof(LNode));
if(!
q)exit(0);
L->next=q;
printf("Pleaseinputthefirstdata:
\n");
scanf("%d",&q->number);
p=q;
while(q->number!
=-1)
{
q=(LinkList)malloc(sizeof(LNode));
if(!
q)exit(0);
printf("Pleaseinputtheoterdata:
\n");
scanf("%d",&q->number);
p->next=q;
p=q;
}
p->next=NULL;
returnL;
}
LinkListCreateList_2()/*建立单链表*/
{
LinkListp,q,L;
inti=50;
L=(LinkList)malloc(sizeof(LNode));
if(!
L)exit(0);
q=(LinkList)malloc(sizeof(LNode));
if(!
q)exit(0);
L->next=q;
p=q;
while(i)
{
q=(LinkList)malloc(sizeof(LNode));
if(!
q)exit(0);
p->next=q;
p=q;
i--;
}
p->next=NULL;
returnL;
}
voidlist(LinkListL)/*输出单链表*/
{
LinkListp=L->next;
while(p!
=NULL&&p->number!
=-1)
{
printf("%3d",p->number);
p=p->next;
}
}
voidListAdd(LinkList&La,LinkList&Lb,LinkList&Lc)
{
LinkListpa,pb,pc;
pa=La->next;pb=Lb->next;
Lc=pc=La;//用La的头结点作为Lc的头结点
while(pa&&pb){
if(pa->number<=pb->number){
pc->next=pa;pc=pa;pa=pa->next;
}
else{pc->next=pb;pc=pb;pb=pb->next;}
pc->next=pa?
pa:
pb;//插入剩余段
free(Lb);
}
}
voidmain()
{
LinkListh;
LinkListk;
LinkListm;
printf("Programbegintocreatethefirstlinklist\n");
h=CreateList();/*建立第一个单链表*/
printf("Programbegintocreatethesecondlinklist\n");
k=CreateList();/*建立第二个单链表*/
m=CreateList_2();
printf("ThefistLinkListis:
\n");
list(h);/*显示单链表*/
printf("\n");
printf("ThesecondLinkListis:
\n");
list(k);/*显示单链表*/
printf("\n");
printf("ThethirdLinkListis:
\n");
list(m);/*显示单链表*/
printf("\n");
}
三)排序+就地置逆+求最大最小值
在题目
(一)的单链表中:
(7)把链表中的元素按照降序排列,显示出该链表;
(8)将这个链表就地逆置(即:
按照升序排列)显示出该链表;
(9)求链表中的最大,最小值,要求在屏幕上输出显示;
#include
#include
#include
#include
#include
#include
typedefstructLNode
{
intnumber;
structLNode*next;
}LNode,*LinkList;
LinkListCreateList()/*建立单链表+求长度*/
{
LinkListp,q,L;
inti=0;
L=(LinkList)malloc(sizeof(LNode));
if(!
L)exit(0);
q=(LinkList)malloc(sizeof(LNode));
if(!
q)exit(0);
L->next=q;
printf("Pleaseinputthefirstdata:
\n");
scanf("%d",&q->number);
p=q;
while(q->number!
=-1)
{
q=(LinkList)malloc(sizeof(LNode));
if(!
q)exit(0);
printf("Pleaseinputtheoterdata:
\n");
scanf("%d",&q->number);
p->next=q;
p=q;
i++;
}
p->next=NULL;
printf("thenumberoftheLinkListis%d\n",i);
returnL;
}
voidlist(LinkListL)/*输出单链表*/
{
LinkListp=L->next;
while(p!
=NULL&&p->number!
=-1)
{
printf("%3d",p->number);
p=p->next;
}
}
intListReverse(LinkList&L)
{
LinkListt,p,q;
t=L->next;
p=t->next;
t->next=NULL;
while(p!
=NULL)
{
q=p->next;
p->next=t;
t=p;
p=q;
}
L=t;
return1;
}
intListMax(LinkListL,int&max)
{
LinkListp=L->next;
max=p->number;
while(p!
=NULL)
{
p=p->next;
if(max
max=p->number;
}
return1;
}
voidmain()
{
LinkListh;
intmax;
printf("Programbegintocreatethelinklist!
!
\n");
h=CreateList();/*建立单链表*/
printf("TheLinkListis:
\n");
list(h);
printf("\n");
ListReverse(h);
printf("逆置后的单链表为:
\n");
list(h);
printf("\n");
ListMax(h,max);
printf("%d\n",max);
}
四)两链表的降序合并
(10)创建两个链表LA,LB,分别显示两链表;
(11)合并两个链表,按照降序输出.
注:
重复元素可以去掉,也可以不去掉.
#include
#include
#include
#include
#include
typedefstructLNode
{
intnumber;
structLNode*next;
}LNode,*LinkList;
LinkListCreateList()/*建立单链表*/
{
LinkListp,q,L;
L=(LinkList)malloc(sizeof(LNode));
if(!
L)exit(0);
q=(LinkList)malloc(sizeof(LNode));
if(!
q)exit(0);
L->next=q;
printf("Pleaseinputthefirstdata:
\n");
scanf("%d",&q->number);
p=q;
while(q->number!
=-1)
{
q=(LinkList)malloc(sizeof(LNode));
if(!
q)exit(0);
printf("Pleaseinputtheoterdata:
\n");
scanf("%d",&q->number);
p->next=q;
p=q;
}
p->next=NULL;
returnL;
}
voidlist(LinkList&L)/*输出单链表*/
{
LinkListp=L->next;
while(p!
=NULL&&p->number!
=-1)
{
printf("%3d",p->number);
p=p->next;
}
}
LinkListListAdd(LinkList&La,LinkList&Lb)
{
LinkListL;
LinkListp,q;
LinkListpa,pb;
pa=La->next;
pb=Lb->next;
L=(LinkList)malloc(sizeof(LNode));
if(!
L)exit(0);
q=L;
while(pa!
=NULL)
{
p=(LinkList)malloc(sizeof(LNode));
if(!
p)exit(0);
p->number=pa->number;
q->next=p;
q=p;
pa=pa->next;
}
free(p);
while(pb!
=NULL)
{
p=(LinkList)malloc(sizeof(LNode));
if(!
p)exit(0);
p->number=pb->number;
q->next=p;
q=p;
pb=pb->next;
}
q->next=NULL;
returnL;
}
voidListSequence(LinkList&L)/*降序排列*/
{
LinkListp,q,max;
inttemp;
for(p=L->next;p->next!
=NULL;p=p->next)
{
max=p;
for(q=p->next;q->next!
=NULL;q=q->next)
{
if(q->number>max->number)
{
max=q;
}
}
if(max!
=p)
{
temp=p->number;
p->number=max->number;
max->number=temp;
}
}
}
voidmain()
{
LinkListh;
LinkListk;
LinkListL;
printf("Programbegintocreatethefirstlinklist\n");
h=CreateList();/*建立第一个单链表*/
printf("Programbegintocreatethesecondlinklist\n");
k=CreateList();/*建立第二个单链表*/
printf("ThefistLinkListis:
\n");
list(h);/*显示单链表*/
printf("\n");
printf("ThesecondLinkListis:
\n");
list(k);/*显示单链表*/
printf("\n");
L=ListAdd(h,k);/*合并单链表*/
ListSequence(L);
printf("ThelastLinkListis:
\n");
list(L);/*显示单链表*/
printf("\n");
}
五)单链表的递归算法
(12)创建单链表
(13)判断单链表是否递增有序
(14)求单链表的最大值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单链表
![提示](https://static.bdocx.com/images/bang_tan.gif)