数据结构课程设计单链表操作文档格式.docx
- 文档编号:22327728
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:15
- 大小:154.10KB
数据结构课程设计单链表操作文档格式.docx
《数据结构课程设计单链表操作文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计单链表操作文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
ﻩDataTypedata;
ﻩﻩﻩﻩ//数据域
ﻩstructNode*next;
ﻩﻩ//指针域
}LNode;
ﻩﻩﻩﻩﻩ//结点的类型
⒊ 所设计的函数
(1)Create(void)
LNode *Create(void)ﻩﻩ//建立单循环链表,链表头结点head作为返回值
{
ﻩinti,j,n,A[M];
ﻩﻩ//建立数组A【M】
LNode*head,*p,*move;
ﻩ
ﻩhead=(LNode*)malloc(sizeof(LNode));
ﻩ//创建空单循环链表
ﻩhead->
next=head;
ﻩmove=head;
ﻩﻩﻩﻩﻩﻩ
ﻩprintf("
请输入数组元素的个数:
"
);
ﻩﻩﻩ//输入数组
scanf("
%d",&
n);
ﻩprintf("
请输入数组:
);
for(i=0;
i<
n;
i++)ﻩﻩﻩﻩﻩ//保存数组元素
ﻩscanf("
%d"
&
A[i]);
//勾链建表,使链表中元素的次序与数组A各元素次序相同
for(j=0;
j<n;
j++)ﻩﻩ//根据一维数组A[M]建立一个单循环链表
{
ﻩﻩp=(LNode*)malloc(sizeof(LNode));
p->
data=A[j];
ﻩﻩﻩﻩﻩ
ﻩﻩp->next=move->
next;
ﻩﻩmove->
next=p;
ﻩ
ﻩﻩmove=move->
next;
ﻩ}
ﻩreturnhead;
ﻩﻩ//返回头指针
}
(2)Locate(LNode*head,DataTypekey)
LNode *Locate(LNode *head,DataTypekey)ﻩ//建立定位查找函数Locate
LNode*q=head->
next;
ﻩ//查找并返回值为key的第1个元素的结点指针;
若找不到,则返回NULL
while(q!
=head&
&
q->
data!
=key)
ﻩq=q->next;
if(q->data==key)
ﻩreturnq;
else
printf("查找的结点不存在!
!
\n");
returnNULL;
}
(3)Search(LNode*head,DataType*a,DataType*b)
//求链表的最大值和次大值,分别由*a和*b带回
void Search(LNode*head,DataType *a,DataType*b)
ﻩLNode *p,*Max,*Secmax;
ﻩp=head->
next->
next;
//*Max和*Secmax指第一个结点,*p指向第二个结点,
ﻩMax=head->
next;
ﻩSecmax=head->next->next;
;
while(p!
=head)
ﻩ{
ﻩﻩif(Max->
data>
p->
data)ﻩﻩ//*Max指向最大值
ﻩ{
ﻩif(p->
data>
Secmax->data)
ﻩﻩﻩﻩSecmax=p;
ﻩﻩ}
ﻩﻩelseﻩﻩﻩﻩﻩﻩﻩﻩ//*Sexmax指向次大值
{
ﻩﻩSecmax=Max;
ﻩﻩMax=p;
ﻩ}
p=p->next;
ﻩ*a=Max->
data;
ﻩﻩﻩﻩ//把最大和次大值分别赋值给*a和*b
*b=Secmax->data;
}
(4)Sort(LNode*head)ﻩ
//查找key,把链表中比key小的作为前驱结点,比key大的作为后继结点
LNode*Sort(LNode *head)ﻩ
{ﻩﻩﻩ//*front指向key前部分链表,*rear指向key后部分链表
LNode*k,*p,*front,*rear,*L;
DataTypekey;
ﻩfront=head;
ﻩﻩﻩﻩﻩﻩ
p=head->
next;
printf("
请输入key:
scanf("
%d",&
key);
ﻩL=Locate(head,key);
ﻩﻩ//调用Locate()查找key
ﻩk=L;
ﻩrear=k;
while(p!
=head)
ﻩif(front->
next!
=k)//判断key前面链表是否已经比较完毕
ﻩ{
if(p->
data>
k->
data)//将key结点前驱比key大的插到key后面
ﻩﻩ{
ﻩﻩﻩfront->next=front->next->next;
ﻩ//断开结点
ﻩﻩp->
next=rear->
next;
ﻩﻩ//插入结点
rear->
next=p;
ﻩﻩﻩ
ﻩrear=rear->
next;
ﻩﻩp=front->
next;
ﻩﻩ//*p指回key的前驱结点
ﻩ}
ﻩﻩﻩelse{
p=p->
ﻩﻩﻩﻩﻩ//移动指针
ﻩﻩﻩfront=front->
next;
ﻩﻩﻩ}
ﻩﻩelse{
ﻩp=rear->next;
ﻩif(p->
data< k->
data)//将key结点后继比key小的插到key前面
ﻩ{
ﻩﻩrear->
next=rear->
next->
next;
ﻩ//断开结点
ﻩp->
next=front->
next;
ﻩﻩ//插入结点
ﻩﻩfront->
next=p;
ﻩfront=front->
next;
ﻩﻩﻩﻩp=rear->next;
ﻩﻩﻩ//*p指回key的后继结点
ﻩ}
ﻩelse{
ﻩﻩﻩp=p->
ﻩﻩﻩﻩﻩﻩ//移动指针
ﻩﻩﻩrear=rear->
next;
ﻩ}
ﻩreturn head;
ﻩﻩﻩ//返回头指针
(5)主函数:
voidmain()ﻩﻩﻩﻩﻩﻩ//主函数
ﻩLNode *L,*W,*H;
DataTypea,b;
ﻩﻩﻩﻩﻩﻩ
ﻩint key,choice;
ﻩﻩ//choice记载操作,key为输入值
ﻩprintf("
\n");
H=Create();
ﻩﻩﻩﻩﻩﻩ//调用Create()建立单循环链表
//界面美化
ﻩprintf("
\n"
ﻩprintf("***************************************************************\n"
printf("
* *\n");
ﻩprintf("*定位查找-------------------------------------------------1*\n"
printf("
* 输出最大和次大值-----------------------------------------2*\n"
printf("
*输出比较值key后的结果------------------------------------3*\n"
ﻩprintf("
*重新输入一个数组-----------------------------------------4*\n");
printf("
*退出系统-------------------------------------------------0*\n"
ﻩprintf("
* *\n"
ﻩprintf("
***************************************************************\n"
printf("\n"
ﻩ//功能选择
printf("
请选择系统功能:
scanf("
%d"
&
choice);
printf("\n"
while(choice!
=0)
ﻩﻩswitch(choice)
ﻩﻩ{
ﻩcase1:
ﻩﻩﻩﻩﻩﻩﻩ//查找数值key并返回指针
ﻩﻩﻩﻩprintf("
请输入要查找的值:
");
ﻩﻩﻩscanf("%d"
key);
ﻩﻩﻩL=Locate(H,key);
ﻩﻩﻩif(L!
=NULL)
ﻩﻩﻩprintf("
查找成功!
!
}
ﻩﻩbreak;
case2:
ﻩﻩﻩﻩ//求链表的最大和次大值
ﻩﻩ{ﻩ
ﻩﻩﻩSearch(H,&
a,&b);
ﻩﻩprintf("
最大值:
%d\n"
a);
ﻩﻩprintf("
次大值:
%d\n"
,b);
ﻩﻩbreak;
ﻩcase3:
ﻩﻩﻩ//将key插入链表中
ﻩ{ﻩﻩﻩ
ﻩﻩH=Sort(H);
ﻩﻩﻩW=H->
next;
ﻩprintf("
结果是:
ﻩﻩﻩ//输出结果
ﻩwhile(W!
=H)
ﻩﻩﻩ{
ﻩﻩﻩprintf("
%d"
,W->
data);
ﻩ//依次输出
ﻩﻩW=W->next;
ﻩﻩ}
ﻩﻩﻩprintf("
ﻩ}
ﻩﻩbreak;
ﻩﻩcase4:
main();
ﻩdefault:
ﻩﻩprintf("
请输入正确的选项!
\n");
//错误处理
}
//功能重复
ﻩprintf("
***************************************************************\n");
printf("* *\n"
printf("
*定位查找-------------------------------------------------1*\n");
ﻩﻩﻩprintf("
*输出最大和次大值-----------------------------------------2 *\n");
ﻩﻩprintf("
*输出比较值key后的结果------------------------------------3*\n");
ﻩprintf("*重新输入一个数组-----------------------------------------4 *\n"
ﻩprintf("
* 退出系统-------------------------------------------------0 *\n"
printf("
* *\n");
***************************************************************\n");
ﻩprintf("
请选择系统功能:
ﻩ
ﻩﻩﻩscanf("
%d"
,&choice);
⒋运行结果:
⒌问题与总结
(1)在编写Create()函数时,要根据一维数组A【M】建立单循环链表,一开始只是用for语句结合头结点创建单链表方法。
后来测试时发现这样无法建立有序的单循环链表,要定义一个移动指针*move总是指向链表最后一个结点。
(2)在编写Search()函数时,一开始是找出链表中最大值,然后删去这个结点,在剩下的结点中找出最大值,最后输出。
但后来测试整个程序运行时,出现每次执行Search()的功能后,别的函数就执行不了,调试之后才知道是找最大和次大值破坏了链表的完整性,导致其他函数执行不了,最后定义了两个指针来带回最大和次大值。
(3)设计Sort()函数时,为了保持结点之间的顺序时,一开始用各种方法,就是实现不了,后来看了队列的一章受到启发,定义指针front和指针rear分别控制结点key的前驱部分和后继部分,最后实现了保持顺序的功能。
(4)设计菜单,一开始选择一个功能时都要输入一个数组,后来在主函数里面调用函数Create(),解决了这个问题。
(5)健壮性处理:
设计菜单是多一个功能:
可以重新输入数组。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 单链表 操作