单链表问题.docx
《单链表问题.docx》由会员分享,可在线阅读,更多相关《单链表问题.docx(12页珍藏版)》请在冰豆网上搜索。
单链表问题
实验报告名称:
实验目的:
1.掌握单向链表的存储特点及其实现。
2.掌握单向链表的插入、删除算法及其应用算法的程序实现
实验报告(实验内容、实验步骤、实验运行结果分析、实验小结)
实验内容:
1.键盘输入一组元素,建立一个带头结点的单向链表(无序)。
2.遍历单向链表。
3.把单向链表中元素逆置(不允许申请新的结点空间)。
4.在单向链表中删除所有的偶数元素结点。
5.编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利
用该函数建立一个非递减有序单向链表。
6.利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。
7.利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。
8.利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇
数,另一个全部为偶数(尽量利用已知的存储空间)。
*9.采用单向链表实现一元多项式的存储并实现两个多项式相加并输出结
果。
10.在主函数中设计一个简单的菜单,分别调试上述算法。
#include
#include
#include
/*构建结点结构体*/
typedefstructLNode{
intdata;
structLNode*next;
}LNode,*LinkList;
/*用于创建链表的函数*/
/*反序构建的*/
LinkListCreateList_L(LinkListL,intn)
{
inti;
LinkListp;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
returnL;
}
intListLength_L(LinkListL)
{
LinkListp;
inti=0;
p=L->next;
while(p)
{
i++;
p=p->next;
}
returni;
}
/*用于插入结点的函数*/
LinkListListInsert_L(LinkListL,inti,intnewnode)
{
LinkListp=L;
LinkLists;
intj=0;
while(p&&j{
p=p->next;
++j;
}
if(!
p||j>i-1)
{
printf("位置小于1或大于表长。
\n");
returnL;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=newnode;
s->next=p->next;
p->next=s;
returnL;
}
/*用于删除结点的函数*/
LinkListListDelete_L(LinkListL,inti)
{
LinkListp=L;
LinkLists;
intj=0;
while(p->next&&j{
p=p->next;
++j;
}
if(!
(p->next)||j>i-1)
{
printf("删除位置不合理。
\n");
returnL;
}
s=p->next;
p->next=s->next;
printf("%s%d\n","被删除的结点是:
",s->data);
free(s);
returnL;
}
LinkListGetListElem_L(LinkListL,inti,int*flag,int*elem)
{
LinkListp=L;
LinkLists;
intj=0;
while(p->next&&j{
p=p->next;
++j;
}
if(!
(p->next)||j>i-1)
{
*flag=0;
returnL;
}
s=p->next;
*flag=1;
*elem=s->data;
returnL;
}
/*用于遍历链表的函数*/
voidListDisp_L(LinkListL)
{
LinkListp;
inti=0;
p=L->next;
printf("该表中元素分别为:
");
while(p)
{
printf("%4d",p->data);
p=p->next;++i;
}
}
/*选择排序算法*/
LinkListListSort_L(LinkListL)
{
LinkListh1,p,q,r,s;
h1=p=(LinkList)malloc(sizeof(LinkList));
p->next=L;
while(p->next)
{
q=p->next;
r=p;
while(q->next)
{
if(q->next->datanext->data)
r=q;
q=q->next;
}
if(r!
=p)
{
s=r->next;
r->next=s->next;
s->next=p->next;
p->next=s;
}
p=p->next;
}
L=h1->next;
free(h1);
returnL;
}
intgetoptions()
{
intopt;
printf("1:
建立链表\n");
printf("2:
显示链表\n");
printf("3:
插入结点\n");
printf("4:
删除结点\n");
printf("5:
返回链表的长度\n");
printf("6:
返回指定结点\n");
printf("7:
将链表进行排序\n");
printf("0:
退出\n");
printf("输入选项并按回车确认:
");
scanf("%d",&opt);
returnopt;
}
intmain(intargc,char*argv[])
{
intopt;
intwhere;
intvalue;
intcount;
inttag;
LinkListL;
while
(1)
{
opt=getoptions();
if(opt==1)
{
printf("请输入链表初始结点数:
");
scanf("%d",&count);
printf("请输入各个结点数值,每输入一个按回车确认:
\n");
L=CreateList_L(L,count);
ListDisp_L(L);
system("PAUSE");
continue;
}
if(opt==2)
{
ListDisp_L(L);
system("PAUSE");
continue;
}
if(opt==3)
{
ListDisp_L(L);
printf("请输入插入位置:
");
scanf("%d",&where);
printf("请输入要插入的数值:
");
scanf("%d",&value);
L=ListInsert_L(L,where,value);
ListDisp_L(L);
system("PAUSE");
continue;
}
if(opt==4)
{
ListDisp_L(L);
printf("请输入要删除的位置:
");
scanf("%d",&where);
L=ListDelete_L(L,where);
ListDisp_L(L);
system("PAUSE");
continue;
}
if(opt==7)
{
L=ListSort_L(L);
ListDisp_L(L);
system("PAUSE");
continue;
}
if(opt==5)
{
ListDisp_L(L);
printf("线性表的长度是:
%d\n",ListLength_L(L));
system("PAUSE");
continue;
}
if(opt==6)
{
printf("请输入要查找的元素位置:
");
scanf("%d",&where);
L=GetListElem_L(L,where,&tag,&value);
if(tag==1)printf("你要查找的元素是:
%d\n",value);
elseprintf("输入的查找元素位置不合理。
\n");
system("PAUSE");
continue;
}
if(opt==0)
{
return0;
}
}
}