数据结构报告书.docx
- 文档编号:17740016
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:10
- 大小:73.82KB
数据结构报告书.docx
《数据结构报告书.docx》由会员分享,可在线阅读,更多相关《数据结构报告书.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构报告书
目录
功能描述·····················································2
概要设计·····················································2
详细设计·····················································3
运行效果·····················································8
心得体会····················································10
1.功能描述
1、利用链表的插入运算建立线性链表,然后实现链表的查找、插入、删除、计数、输出、排序、逆置等运算,并能在屏幕上输出操作前后的结果。
2.概要设计
2.1链表创建:
逆序建立一个单链表,输入链表中要存储的信息。
2.2数据输出:
实现对单链表中数据的输出。
2.3数据查找:
查找单链表中指定位置的数据并输出其位置和数据。
2.4数据插入:
实现向单链表中插入数据,插入时需输入要插入的位置和要插入的数据。
2.5数据删除:
实现对单链表中指定位置的数据的删除,删除数据时需要输入要删除数据的位置。
2.6数据计数:
实现对链表的计数,并返回其值。
2.7数据排列:
实现对单链表中的数据进行从小到大排列。
2.8数据逆置:
对单链表中的数据的位置进行逆置,即,使其输出顺序颠倒。
表2.1功能模块关系图
3.详细设计
3.1主界面:
链表主界面上显示该程序所能实现的功能:
创建链表、插入、删除、查找、计数、排序、逆置、退出,它们分别对应1~8的序号,当要执行某项功能时,输入该功能前面所对应的序号。
3.2链表创建:
本程序用的是逆序创建链表的方法。
建立线性表的链式存储结构的过程就是一个动态生成链表的过程,即从“空表”的状态起,依次建立个元素结点,输入结点的值并逐个插入链表。
每建立一个结点就把头指针的指针域的值给新建的结点,然后头指针再指向该结点,循环执行,即把后建立的结点插入到前面,链表就逆序建成了。
在屏幕上输入“1+回车”实现该功能。
程序如下:
voidCreatList(Lnode*L)
{
Lnode*p;
inte,i,n;
L->next=NULL;
printf("yuansugeshu:
");
scanf("%d",&n);
printf("\nqingnixushurulianbiaoyuansu:
\n");
for(i=n;i>0;--i)
{
scanf("%d",&e);
p=(Linklist)malloc(sizeof(Lnode));
p->data=e;p->next=L->next;L->next=p;
}
}
3.3数据输出:
定义一个指针,指向链表头结点的下一结点,如果为空,则输出“链表为空”;否则,运用while循环,输出链表中各元素的值,并将指针指向下一结点,直到链表为空。
程序如下:
voidPrintList(Lnode*L)
{
Lnode*p=L->next;
if(p==0)
printf("lianbiaoweikong");
else
printf("muqianlianbiaowei:
");
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
3.4数据查找:
从头指针出发,顺链域next逐个结点往下搜索,直到搜索到第i个结点并返回其值,如果结点位置出错,则返回0。
在屏幕上输入“2+回车”实现该功能。
程序如下:
StatusGetElem_L(Lnode*L,inti)
{
Lnode*p=L->next;
intj=1;inte;
while(p&&j
{p=p->next;++j;}
if(!
p||j>i)return0;
e=p->data;returne;
}
3.5数据插入:
在单链表中第i个位置之前插入数据之前,首先要运用while语句找到第i-1个位置,如果结点位置超出或输入错误,则返回0;否则,建立一个新的结点并赋值,然后修改第i-1个结点的后继指针为插入结点的后继指针,再将第i-1个结点指向插入结点,并返回1。
在屏幕上输入“3+回车”实现该功能。
程序如下:
intListInsert_L(Lnode*L,inti,inte)
{
Lnode*p=L,*q;
intj=0;
while(p&&j {p=p->next;++j;} if(! p||j>i-1) return0; q=(Linklist)malloc(sizeof(Lnode)); q->data=e;q->next=p->next;p->next=q; return1; } 3.6数据删除: 先运用while语句找到第i-1个结点,如果结点位置出错,返回0;否则,修改其后继指针,然后释放第i个结点所占的空间,并返回1。 在屏幕上输入“4+回车”实现该功能。 程序如下: intListDelete_L(Lnode*L,inti) { Lnode*p=L,*q; intj=0; while(p->next&&j {p=p->next;++j;} if(! p->next||j>i-1) return0; q=p->next;p->next=q->next;free(q); return1; } 3.7计数: 运用while语句从链表头指针开始循环,每次将定义的计数变量加1,直到结点的指针域为空。 然后返回定义变量的值。 在屏幕上输入“5+回车”实现该功能。 程序如下: intjishu(Lnode*L) { Lnode*p=L,*q; intj=0; while(p) { p=p->next; ++j; } returnj; } 3.8数据排列: 使用选择法借助移动指针对链表的数据元素进行排序,然后输出即可。 在屏幕上输入“6+回车”实现该功能。 程序如下: voidpaixu(Lnode*L) { Lnode*p,*q,*min; inte; for(p=L->next;p->next! =NULL;p=p->next) { min=p; for(q=p->next;q;q=q->next)/*找到链表中最小元素*/ if(q->data min=q; if(min! =p) { e=p->data;p->data=min->data;min->data=e; } } } 3.9数据逆置 在屏幕上输入“7+回车”,实现该功能。 程序如下: voidnizhi(Lnode*L) { Linklistp,q,r; p=L->next; q=p->next; while(q! =NULL) { r=q->next; q->next=p; p=q; q=r; } L->next->next=NULL;/*第一个结点指向空*/ L->next=p;/*头指针指向最后一个结点*/ } 4.运行效果 以下是各个功能界面的运行效果图。 链表界面: 图4.1主界面 图4.2创建链表界面 图4.3数据查找界面 图4.4数据插入界面 图4.5数据删除后输出界面 图4.6数据计数界面 图4.6链表排序界面 图4.7数据排序后再逆置的界面 5.心得体会 通过这次课设,让我把课本上的知识搬到了实际中,把我以前不太明白的地方都明明白白的告诉了我。 在学习课本时,都是通过想象,而且也不太明白怎样把那些算法运用c语言编写出来。 而这次课设,可以说是让我茅塞顿开。 虽然课设时出现很多问题,但也不失为好的锻炼。 总的来说,这次课设让我学会很多。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告书