带头结点的并具有头尾指针的单循环链表.docx
《带头结点的并具有头尾指针的单循环链表.docx》由会员分享,可在线阅读,更多相关《带头结点的并具有头尾指针的单循环链表.docx(22页珍藏版)》请在冰豆网上搜索。
带头结点的并具有头尾指针的单循环链表
长治学院
课程设计任务书
课程名称:
数据结构课程设计
设计题目:
带头结点的并具有头尾指针的单循环链表
系别:
计算机系
专业:
网络工程
学生姓名:
王鲁俊学号:
07407320
起止日期:
2008年11月08日~2008年12月18日
指导教师:
孙俊杰
课程设计题目
带头结点并具有头尾指针的单链表的各种操作
姓名
王鲁俊
学号
07407320
班级
07级计3班
系别
计算机系
专业
网络工程
组员
王鲁俊李显
指导教师
孙俊杰
课程设计目的
1、为了熟练地掌握带头节点和头尾指针单循环链表的各种操作;
2、为了以后使用带头节点头尾指针单循环链表时更加地方便。
课程设计环境
Turboc2、windowsXP
课程设计任务和要求
1.编写带头结点并具有头尾指针的单循环链表。
2.密码和存盘程序的编写。
3.编写各种操作算法。
4.上机调试程序。
课程设计工作进度计划
序号
起止日期
工作内容
1
2008.11.06—11.15
需求分析
2
2008.11.18—11.23
查阅相关资料
3
2008.11.28—12.3
密码和存盘的编写
4
2008.12.14—12.15
操作算法编写
5
2008.12.18
上机调试并完成课程设计
教研室审核意见:
教研室主任签字:
年月日
教学院(系)审核意见:
主任签字:
年月日
目录
第一章需求分析-------------------------------------------------------------------------3
第二章开发过程-------------------------------------------------------------------------3
2.1系统目标----------------------------------------------------------------------3
2.2设计出友好的界面-------------------------------------------------------32.3实现基本功能----------------------------------------------------------------3
2.5功能划分----------------------------------------------------------------------3
第三章系统设计--------------------------------------------------4
3.1系统设计方法-------------------------------------------4
3.2数据结构设计-------------------------------------------4
3.3数据结构设计概述---------------------------------------4
3.4数据实体类型-------------------------------------------4
3.5流程图-------------------------------------------------5
3.6程序中的源代码-----------------------------------------5
第四章附录-----------------------------------------------------13
第一章需求分析
1.编写带头结点头尾指针的单循环链表,并实现功能如下:
1.编写该单循环链表的环境
2.保存数据
3.建立密码,密码修改
4.单循环链表的位置查找.插入.删除.排序等操作
第二章开发过程
2.1系统目标
本系统的目标是实现单向链表的各种操作,方便用户对数据的各种操作。
2.2设计友好界面
设计友好界面,实现界面人为化,使系统简单,使用户能舒心.方便的实现自己的操作
2.3实现一些基本功能
在单循环链表的某一位置的前面或后面插入某一数据,删除单向链表中的某一结点,返回某一结点的位置,实现升序排序,降序排序的算法,至零,清空等各种算法。
2.4功能划分
1.友好界面
2.密码编写
3.修改密码
4.数据存盘
5.单循环链表的各种操作
第三章系统设计
3.1系统设计的方法
系统设计是把需求转化为软件系统的最重要的环节。
系统设计的优劣在根本上决定了软件系统的质量。
系统设计的五个方面的要求:
体系结构设计,模块设计,数据结构设计与算法设计,用户界面设计。
3.2数据结构设计
3.2.1数据结构设计概述
数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及他们之间的关系和操作等的学科。
“数据结构”的研究不仅涉及到计算机硬件的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据单元在存储器中的分配问题。
良好的数据结构设计,可以提高数据信息的存储效率,保证数据信息的完整性和一致性。
同时,一个合理的数据结构有利于程序的实现。
这里选用TURBOC2作为编译环境。
3.2.2数据实体类型
节点定义:
每个节点包括数据域data,指针域next。
Data
next
链表定义:
链表S,头指针Head,尾指针tail
Data
3.3流程图
3.4界面中单链表的部分算法:
3.4.1
voidgaimi()
{
inti=0;
charch,a[6],b[6];
printf("请输入原始密码:
");
ch=getchar();
gets(a);
while((yanzheng1(a))!
=6)
{
printf("请输入原始密码:
");
gets(a);
}
while
(1)
{
printf("输入新设密码:
");
gets(a);
printf("再次输入新设密码:
");
gets(b);
while(a[i]==b[i])
i++;
if(i==5)break;
elsei=0;
}
xiugai(a);
}
voidxiugai(char*x)
{
FILE*fp;
fp=fopen("mima","wb");
fputs(x,fp);
printf("\t****************************************************\n");printf("\t***************************************************\n");printf("\t******************密码修改成功!
!
******************\n");
printf(“\*************任意键继续操作*************\n");printf("\t***************************************************\n");
getch();
fclose(fp);
}
intyanzheng1(char*x)
{
FILE*fp;
inti=0;
charch;
if((fp=fopen("mima","r"))==NULL)
{
printf("无密码.\n");
}
ch=fgetc(fp);
while(ch!
=EOF)
{
if(x[i]==ch)
i++;
ch=fgetc(fp);
}
if(i==5)
{
printf("密码正确.\n");
}
else
{
printf("密码错误.\n");
}
fclose(fp);
return(i);
}
voidInsbefore(LNodelist*s)
{/*在链表中一个结点前插入一个数据5*/
LNode*p,*q,*t;intx,y,i;
printf("输入该链表中一个结点的值:
\n");
scanf("%d",&x);
p=s->head;t=p->next;
if(s->head->data==x)
{
printf("输入要插入的数据:
\n");
scanf("%d",&y);
q=(LNode*)malloc(sizeof(LNode));
q->data=y;
q->next=s->head;
s->tail->next=q;
s->head=q;
}
else{
while(p->next->data!
=x&&p->next!
=s->head)
{p=p->next;t=t->next;}
if(p->next->data!
=x&&p->next==s->head)printf("数据插入位不存在!
\n");
else{
printf("输入要插入的数据:
\n");
scanf("%d",&y);
q=(LNode*)malloc(sizeof(LNode));
q->data=y;
q->next=t;
p->next=q;
printf("输出插入数据后的链表:
\n");
Printlink(s);
}
}
printf("是否储存数据.(0:
否1:
是)\n");
scanf("%d",&i);
if(i==1)
chucun(s);
elseprintf("数据没有存储!
\n");
}
voidInsAfter(LNodelist*s)
{/*在链表中的一个结点后插入一个数据6*/
LNode*p,*q,*t;intx,y,i;
printf("输入该链表中的一个结点的值:
\n");
scanf("%d",&x);
p=s->head;t=p->next;
while(p->data!
=x&&p->next!
=s->head)
{p=p->next;t=t->next;}
if(p->data!
=x&&p->next==s->head){printf("输入的数据不存在!
\n");}
else
{printf("输入要插入的数据:
\n");
scanf("%d",&y);
q=(LNode*)malloc(sizeof(LNode));
q->data=y;
q->next=t;
p->next=q;
printf("输出插入数据后的链表:
\n");
Printlink(s);
}
printf("是否储存数据.(0:
否1:
是)\n");
scanf("%d",&i);
if(i==1)
chucun(s);
elseprintf("数据没有存储!
\n");
}
voidSetcurelem(LNodelist*s)
{/*链表中的一个结点用另一个数据替换7*/
LNode*p,*q,*t;intx,y,i;
printf("输入链表中被替换的数据:
\n");
scanf("%d",&x);
p=s->head;t=p->next;
while(p->data!
=x&&p->next!
=s->head)
{p=p->next;t=t->next;}
if(p->data!
=x){printf("被更新的数据不存在!
");}
else
{printf("输入新数据:
\n");
scanf("%d",&y);
p->data=y;
printf("输出被替换后的单循环链表:
\n");
Printlink(s);
printf("是否储存数据.(0:
否1:
是)\n");
scanf("%d",&i);
if(i==1)
chucun(s);
elseprintf("数据没有存储!
\n");
}
}
voidGetcurelem(LNodelist*s)
{/*反回链表中的一个结点8*/
LNode*p;intx;
printf("输入链表一个结点值:
\n");
scanf("%d",&x);
p=s->head;
while(p->data!
=x&&p->next!
=s->head)
p=p->next;
if(p->data!
=x){printf("要输出的结点不存在!
");}
else
{printf("输出该结点的值:
\n");
printf("%d",p->data);
}
}
voidlistempt(LNodelist*s)
{/*判链空9*/
LNode*p;inti=0;
p=s->head;
while(p->next!
=s->head&&p!
=NULL)
{p=p->next;i++;}
if(i==0)printf("链表为空!
");
elseprintf("链表不为空!
");
}
voidlengthlist(LNodelist*s)
{/*输出单循环链表中元素的个数10*/
LNode*p;inti=0;
p=s->head;
if(p==NULL){printf("该链表为空链表!
");}
else
{while(p->next!
=s->head)
{p=p->next;i++;}
printf("输出链表中元素的个数:
\n");
printf("%d",i);
}
}
voidgethead(LNodelist*s)
{/*输出第一个结点的位置11*/
printf("输出第一个结点的位置:
\n");
printf("%d",s->head->data);
}
voidNextpos(LNodelist*s)
{/*在链表中的一个结点直接后继位置14*/
LNode*p,*q;intx,y;
printf("输入链表中一个结点值:
\n");
scanf("%d",&x);
p=s->head;
while(p->data!
=x&&p->next!
=s->head)
p=p->next;
if(p->data!
=x){printf("该结点不存在!
");exit(0);}
else
{printf("输出该结点的后继位置:
\n");
printf("%d",p->next->data);
}
}
voidLocatepos(LNodelist*s)
{/*输出链表中第i个结点的位置15*/
LNode*p,*q;inti,j=1;
printf("输入链表任意一结点的下标值:
");
scanf("%d",&i);
p=s->head;
while(j!
=i&&p!
=s->tail)
{p=p->next;j++;}
if(p==s->tail)
{if(j==i)
{printf("输出该结点的值:
\n");
printf("%d",p->data);
}
elseprintf("输入位置有误!
\n");
}
else
{printf("输出该结点的值:
\n");
printf("%d",p->data);
}
}
voidpaixu(LNodelist*s)
{/*单循环链表排序16*/
LNode*p,*q,*t;inti;
p=s->head;
printf("请选择操作号:
\n1:
从大到小排序.\n2:
从小到大排序.\n");
scanf("%d",&i);
switch(i)
{
case1:
printf("单循环链表从大到小排序:
\n");
while(p->next!
=s->head)
{
q=p->next;
while(q!
=s->head)
{
if(p->datadata)
{
t=p->data;p->data=q->data;q->data=t;
}
elseq=q->next;
}
p=p->next;
}
printf("从大到小输出单循环链表:
\n");
Printlink(s);
break;
case2:
while(p->next!
=s->head)
{
q=p->next;
while(q!
=s->head)
{
if(p->data>q->data)
{
t=p->data;p->data=q->data;q->data=t;
}
elseq=q->next;
}
p=p->next;
}
printf("从小到大输出单循环链表:
\n");
Printlink(s);
break;
default:
printf("输入的操作号不正确!
\n");
}
printf("是否储存数据.(0:
否1:
是)\n");
scanf("%d",&i);
if(i==1)
chucun(s);
elseprintf("数据没有存储!
\n");
}
intchucun(LNodelist*s)
{/*存储数据*/
FILE*fp=NULL;
charfilename[10],ch;
LNode*p=s->head;
if(s==NULL)
{printf("链表不存在,请建立链表:
");
getch();
return0;
}
printf("输入文件名:
");
scanf("%s",filename);
while((fp=fopen(filename,"r"))!
=NULL)
{fclose(fp);
printf("链表已存在,请从新建立链表\n");
ch=getchar();
printf("请输入文件名:
");
scanf("%s",filename);
}
fp=fopen(filename,"w");
while(p->next!
=s->head)
{
fwrite(p,sizeof(LNode),1,fp);
p=p->next;
}
fwrite(p,sizeof(LNode),1,fp);
fclose(fp);
printf("存储成功.\n");
return
(1);
}
intopenfile(LNodelist*s)
{FILE*fp;
charfilename[10];
LNode*p=NULL,*q=NULL;
p=s->head;
printf("请输入要打开的文件名:
");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("文件不存在!
请从新输入文件名!
\n");
getch();return0;
}fread(p,sizeof(structnode),1,fp);
while(!
feof(fp))
{q=(LNode*)malloc(sizeof(LNode));
if(fread(q,sizeof(structnode),1,fp)!
=1)break;
q->next=p->next;p->next=q;p=q;
}p->next=s->head;
fclose(fp);Printlink(s);return
(1);
}
参考文献:
[1]《C程序设计(第三版)》,谭浩强,清华大学出版社,2005.
[2]《数据结构(C语言版)》,严蔚敏,清华大学出版社,2007。
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
1、设计过程中出勤、学习态度等方面
0.1
2、设计技术水平
0.4
3、编程风格
0.2
4、设计报告书写及图纸规范程度
0.3
总成绩
教研室审核意见:
教研室主任签字:
年月日
教学院(系)审核意见:
主任签字:
年月日
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
1、设计过程中出勤、学习态度等方面
0.1
2、设计技术水平
0.4
3、编程风格
0.2
4、设计报告书写及图纸规范程度
0.3
总成绩
教研室审核意见:
教研室主任签字:
年月日
教学院(系)审核意见:
主任签字:
年月日