单链表.docx
《单链表.docx》由会员分享,可在线阅读,更多相关《单链表.docx(9页珍藏版)》请在冰豆网上搜索。
单链表
面向对象程序设计大作业
------单链表
学院名称数学与系统科学学院
专业班级统计学12级二班
学生姓名李军
学号201201051509
指导教师孙红梅
完成时间:
2014年5月8日
实验题目及要求
1,基本要求
建立一个单链表类,该链表类能够实现以下功能:
(1)有合理的构造函数,能够由用户09输入数据,创建链表,如果用户输入的数据不合理,能够给出提示信息
(2)能够实现单链表元素的遍历
(3)能够在指定位置插入一个元素
(4)能够删除指定位置的元素
(5)能够统计单链表中的元素个数并输出
2.需求分析
建立一个单链表,实现单链表的初始化,插入、删除节点等功能,以及确定某一元素在单链表中的位置。
该系统通过建立一个单链表类实现链表的创建,链表元素的遍历,元素的插入、删除,元素个数的统计。
3.实验步骤
(1)、单链表的存储定义
(2)、从键盘上依次输入21、18、30、75、42、56,逆序创建单链表,并输出单链表中的各元素值。
(3)、分别在单链表的第3个位置和第9个位置插入67和10,给出插入成功或失败的信息,并输出单链表中的各元素值。
(4)、删除单链表中的第6个数据元素和第8个数据元素,给出删除成功或失败的信息,并输出单链表中的各元素值。
(5)、取单链表中的第5个数据元素和第7个数据元素
4.使用说明
程序执行后,界面直接输出要求的结果。
5.执行结果
6.源代码
#include
#include
#include
#defineERROR0;
typedefstructLNode
{
intdata;
structLNode*next;
}LNode,*LinkList;
LinkListInitList(LinkListL)
{
LinkListnode=NULL;
node=(LinkList)malloc(sizeof(LNode));
if(!
node)
{
returnERROR;
}
node->next=NULL;
L=node;
returnL;
}
intListLength(LinkListL)
{
LinkListp=NULL;
intcount=0;
p=L;
while(p->next)
{
count++;
p=p->next;
}
returncount;
}
LinkListCreateList_L(LinkListL,intn)
{
inti;
LinkListp=NULL;
for(i=n;i>0;i--)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
returnL;
}
LinkListListInsert(LinkListL,inti,inte)
{
intj=0;
LinkLists=NULL,p=NULL;
p=L;
while(p&&j{
p=p->next;
j++;
}
if(!
p||j>i-1)
{
printf("输入的位置不合法!
!
!
\n");
returnL;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
returnL;
}
LinkListListDelete(LinkListL,inti)
{
intj;
LinkListq=NULL,p=NULL;
p=L;
j=0;
while(p->next&&j{
p=p->next;
j++;
}
if(!
(p->next)||j>i-1)
{
printf("输入的位置不合法!
!
!
\n");
returnL;
}
q=p->next;
p->next=q->next;
free(q);
returnL;
}
intGetElem(LinkListL,inti)
{
intj,e;
LinkListp=NULL;
if(i<1||i>ListLength(L))
{
printf("输入的位置不合法!
!
!
\n");
returnj;
}
p=L->next;
j=1;
while(j
{
p=p->next;
j++;
}
e=p->data;
printf("第%d位的数据元素为%d\n",i,e);
}
voidmenu()
{
printf("*************目录**************\n");
printf("输出单链表中的各元素值1\n");
printf("在单链表中插入数据元素2\n");
printf("在单链表中删除数据元素3\n");
printf("取出单链表中的数据元素4\n");
printf("结束程序0\n");
printf("*******************************\n");
}
voidmain()
{
intn,m,i,e;
LinkListL=NULL,p=NULL;
L=InitList(L);
printf("请输入元素个数:
");
scanf("%d",&n);
printf("依次输入%d个数据元素:
",n);
L=CreateList_L(L,n);
do
{
printf("\n\n");
menu();
printf("请输入你的选择:
");
scanf("%d",&m);
switch(m)
{
case1:
printf("现在链表的元素为:
");
p=L->next;
while(p!
=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
break;
case2:
printf("依次输入插入位置和数据元素(空格隔开):
");
scanf("%d%d",&i,&e);
L=ListInsert(L,i,e);
break;
case3:
printf("输入需要删除的元素的位置:
");
scanf("%d",&i);
L=ListDelete(L,i);
break;
case4:
printf("输入需要取出的元素的位置:
");
scanf("%d",&i);
GetElem(L,i);
break;
case0:
printf("已结束程序!
!
!
\n");
break;
default:
printf("输入错误!
!
!
\n");
}
}while(m!
=0);
}
7.小结
本次试验对所学链表的理论知识进行了实践,加深了对链表的理解,对于链表的基本操作进行了系统的练习。
实验过程中也遇到了很多错误,节点的插入点选择错误,输出链表错误等等,实验的过程就是发现错误、改正错误,并从中学习到新知识的过程。
这次试验我学到的不仅仅是课本上的知识,更重要的是做好一次实验的方法和所必需的耐心与细心。