本科毕业设计论文数据结构课程设计.docx
- 文档编号:23658390
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:43
- 大小:400.28KB
本科毕业设计论文数据结构课程设计.docx
《本科毕业设计论文数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《本科毕业设计论文数据结构课程设计.docx(43页珍藏版)》请在冰豆网上搜索。
本科毕业设计论文数据结构课程设计
桂林航天工业学院
实验报告
系(部):
计算机科学与工程系
课程名称:
数据结构
专业班级:
计算机应用技术1班
学号:
学生姓名:
完成日期:
2016年12月22日
一、运行环境
操作系统:
Windows1064位操作系统
编译软件:
MicrosoftVisualC++6.0
处理器:
Intel(R)Core(TM)2CPU6320@1.86GHz1.86GHz
安装内存(RAM):
2.00GB
二、算法设计的思想和设计分析及流程图
1.线性表的顺序存储
1.插入:
算法思想:
查找到元素X需要插入到线性表L的位置i,将该位置i后面的元素后移,将要元素X插入到i位置,表长加1。
设计分析:
先使用
if(L->last==MAXSIZE1-1)
提示空间满
elseif(i<1||i>L->last+2)
提示位置错误
函数判断位置i在该线性表L中是否存在,若位置i正确再使用
for(j=L->last;j>=i-1;j--)
{
L->data[j+1]=L->data[j];
}
使该位置i后面的数据元素后移,然后将数据元素插入到位置i,表长加1。
流程图:
2.删除:
算法思想:
先判断线性表L是否存在数据元素i,然后在线性表L中删除序号为i的数据元素,删除后使序号为i+1,i+2,...,n的元素变为序号为i,i+1,...,n-1,删除后新表长=原表长-1。
设计分析:
先使用
if(i<1||i>L->last+1)
提示数据元素不存在
判断元素i在线性表L中是否存在,若数据元素i存在再使用
for(j=i;j<=L->last;j++)
{
L->data[j-1]=L->data[j];
}L->last--;
使数据元素i后面的数据元素前移,将数据元素i覆盖删除,然后表长减1。
流程图:
3.查找:
算法思想:
调用函数查找数据元素i,如果其调用函数结果返回在线性表L中首次出现的值为i的那个元素的序号或地址,称为查找成功;否则,在L中未找到值为x的数据元素,返回某特殊值表示查找失败。
设计分析:
先使用
while(y<=L->last&&L->data[y]!
=x)
y++;
查找数据元素i在线性表L中的位置,如果查找失败则使用
if(y>L->last)
return-1;
返回特殊值,否则使用
elsereturny+1;
返回该数据元素的地址。
流程图:
4.Main主函数:
算法思想:
使用Do…while实现主函数的菜单界面,使用switch…case实现函数的调用。
设计分析:
使用do…while做出主菜单,使用
scanf("%d",&k);
getchar();
switch(k)
{
case1:
case2:
case3:
case4:
case5:
}
实现函数的调用。
2.线性表的链式存储
1.建表:
算法思想:
使用头插入法建立单链表,该方法从一个空表开始,重复读入数据,生成新结点,将读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标志为止。
设计分析:
使用p=(LNode2*)malloc(sizeof(LNode2));开辟一个动态空间
使用
p->data=c;
p->next=head;
进行赋值和使指针后移,再用head=p;使head与p同指向。
流程图:
2.按序号查找:
算法思想:
调用函数查找数据元素i,从链表的头指针出发,顺链域next逐个结点往下搜索,直到搜索到第i个结点为止。
设单链表的长度为n,要查找表中第i个结点,仅当1≦i≦n时,i的值是合法的。
但有时需要找头结点的位置,故我们将头结点看做是第0个结点。
设计分析:
使用while(p->next&&j
使用
p=p–>next;
j++;
进行地址和指针后移,
再用
if(i==j)returnp;
elsereturnNULL;
返回查找结果。
流程图:
3.插入:
算法思想:
插入运算是将值为x的新结点插入到表的第i个结点的位置上首先找到ai-1的存储位置p,然后生成一个数据域为x的新结点*q,并令结点*p的指针域指向新结点,新结点的指针域指向结点ai。
设计分析:
使用
p=Get_LinkList(L,i-1);
if(p==NULL)
{
printf("位置错误");
return0;
}
判断i的是否存在,若存在,则使用
q=(LNode*)malloc(sizeof(LNode));
q->data=x;
q->next=p->next;
p->next=q;
进行插入,
再用
return1返回插入结果。
流程图:
4.删除:
算法思想:
将表的第i个结点删去,是在单链表中结点ai的存储地址是在其直接前趋结点aai-1的指针域next中,所以我们必须首先找到ai-1的存储位置p。
然后令p–>next指向ai的直接后继结点,即把ai从链上摘下。
最后释放结点ai的空间。
设计分析:
使用
p=Get_LinkList(L,i-1);
if(p->next==NULL)
{
return0;
}
判断i的是否存在,若存在,则使用
q=p->next;
p->next=q->next;
free(q);
进行删除和释放,
再用
return1返回删除结果。
流程图:
5.Main主函数:
算法思想:
使用Do…while实现主函数的菜单界面,使用if…else实现函数的调用。
设计分析:
使用do…while做出主菜单,使用
scanf("%d",&k);
getchar();
if(k==1)
elseif(k==2)
elseif(k==3)
实现函数的调用。
3.栈的应用
1.置空栈:
算法思想:
使链栈的头指针指向空。
设计分析:
使用top=NULL;将头指针赋值为空。
流程图:
2.链式进栈:
算法思想:
在栈顶插入新的元素,先使栈顶指针top加1,再给top赋值
设计分析:
使用p=(LinkStack3)malloc(sizeof(StackNode3));建立新结点,使用
p->data=x;
p->next=top;
top=p;实现栈顶top的加1和赋值。
流程图:
3.链式入栈:
算法思想:
先使栈顶指针top减1,再释放删除的数据i。
设计分析:
使用
*x=top->data;
p=top;
top=top->next;
free(p);实现栈顶top的减1和释放。
流程图:
4.Main主函数:
算法思想:
使用Do…while实现主函数的菜单界面,使用switch…case实现函数的调用。
设计分析:
使用do…while做出主菜单,使用
scanf("%d",&k);
getchar();
switch(k)
{
case1:
case2:
case3:
case4:
case5:
}
实现函数的调用。
4.队列的应用
1.置空队:
算法思想:
对头指针front和队尾指针rear指向同一个位置
设计分析:
使用
Q->rear=Q->front=T;
T->next=NULL
将头指针front和队尾指针rear指向同一个位置T,再把T的next指向NULL。
流程图:
2.进队列:
算法思想:
入队时将新元素插入队尾指针rear所指的位置,然后将队尾指针rear加1
设计分析:
使用p->data=x;新元素插入队列,再使用
p->next=NULL;
Q->rear->next=p;
Q->rear=p;rear指针加1
流程图:
3.出队列:
算法思想:
出队时先判断元素是否存在,若存在则将队尾指针rear减1,再释放元素。
设计分析:
使用if(queueempty(Q))判断元素是否存在,若存在再使用
p=Q->front;
x=p->next->data;
Q->front=p->next;
free(p);
将队尾指针rear减1和释放元素。
流程图:
4.Main主函数:
算法思想:
使用Do…while实现主函数的菜单界面,使用switch…case实现函数的调用。
设计分析:
使用do…while做出主菜单,使用
scanf("%d",&k);
getchar();
switch(k)
{
case1:
case2:
case3:
case4:
case5:
}
实现函数的调用。
5.二叉树的遍历和应用
1.建二叉树
算法思想:
对一般的二叉树,首先添加若干个虚结点,使其成为完全二叉树,然后依次输入结点信息,若输入结点非虚结点,则建立一个新结点;若是第一个则令其为根结点,否则将新结点链接到它的双亲结点上。
如此反复直到输入结束信息为止。
设计分析:
使用
scanf("%d",&x);
if(x==0)
判断输入结点结束,再使用
T=(BTree5*)malloc(sizeof(BTree5));
T->data=x;
printf("请输入%d结点的左孩子:
",T->data);
T->LChild=CreatBTree();
printf("请输入%d结点的右孩子:
",T->data);
T->RChild=CreatBTree();
二叉树的前序遍历的递归算法建立二叉树。
流程图:
2.前序递归遍历二叉树
算法思想:
访问根结点,先序遍历左子树,先序遍历右子树。
设计分析:
使用printf("%d",T->data);访问根结点
使用PreOrder(T->LChild);递归遍历左子树
使用PreOrder(T->RChild);递归遍历右子树
流程图:
3.中序递归遍历二叉树
算法思想:
中序遍历左子数,访问根节点,中序遍历右子树
设计分析:
使用InOrder(T->LChild);递归遍历左子树
使用printf("%d",T->data);访问根结点
使用InOrder(T->RChild);递归遍历右子树
流程图:
4.后序递归遍历二叉树
算法思想:
后序遍历左子树,访问根节点,后序遍历右子树
设计分析:
使用postOrder(T->LChild);递归遍历左子树
使用postOrder(T->RChild);访问根结点
使用printf("%d",T->data);递归遍历右子树
流程图:
5.Main主函数:
算法思想:
使用Do…while实现主函数的菜单界面,使用if…else实现函数的调用。
设计分析:
使用do…while做出主菜单,使用
scanf("%d",&k);
getchar();
if(k==1)
elseif(k==2)
elseif(k==3)
实现函数的调用。
三、源代码
1.一级菜单
#include"实验1.c"
#include"实验2.c"
#include"实验3.c"
#include"实验4.c"
#include"实验5.c"
voidmain()
{
intk;
do
{
printf("\n\n\n\n");
printf("\t\t\t数据结构课程设计一级菜单\n");
printf("\t\t***************************************\n");
printf("\t\t*1----线性表的顺序存储 *\n");
printf("\t\t*2----线性表的链式存储 *\n");
printf("\t\t*3----栈的应用 *\n");
printf("\t\t*4----队列的应用 *\n");
printf("\t\t*5----二叉树的遍历和应用 *\n");
printf("\t\t*0----返 回 *\n");
printf("\t\t***************************************\n");
printf("\t\t请选择菜单项(0-5):
");
scanf("%d",&k);
getchar();
switch(k)
{
case1:
main1();//线性表的顺序存储
break;
case2:
main2();//线性表的链式存储
break;
case3:
main3();//栈的应用
break;
case4:
main4();//队列的应用
break;
case5:
main5();//二叉树的遍历和应用
break;
}
}while(k!
=0);
}
2.实验1---线性表的顺序存储
#include"stdio.h"
#include"malloc.h"
#defineMAXSIZE1200//线性表允许的最大长度
#definedatatype1int
typedefstruct//定义线性表的结构
{datatype1data[MAXSIZE1];//表示线性表(a1,a2,….,an)
intlast;//last表示线性表的实际长度
}SeqList1;
/*线性表初始化:
Init_List(L)
初始条件:
表L不存在
操作结果:
构造一个空的线性表*/
SeqList1*insert_SeqList()
{SeqList1*L;
L=(SeqList1*)malloc(sizeof(SeqList1));//L=newSeqList;
L->last=-1;
returnL;
}
/*插入操作:
Insert_List(L,i,x)
初始条件:
线性表L存在,插入位置正确(1<=i<=n+1,n为插入前的表长)。
操作结果:
在线性表L的第i个位置上插入一个值为x的新元素,
这样使原序号为i,i+1,...,n的数据元素的序号变为i+1,i+2,...,n+1,插入后表长=原表长+1。
*/
intInsert_SeqList(SeqList1*L,inti,datatype1x)
{
intj;
if(L->last==MAXSIZE1-1)
{
printf("空间满");
return0;
}
elseif(i<1||i>L->last+2)
{
printf("位置错误");
return0;
}
for(j=L->last;j>=i-1;j--)
{
L->data[j+1]=L->data[j];
}
L->data[i-1]=x;
L->last++;
return1;
}
/*删除操作:
Delete_List(L,i)
初始条件:
线性表L存在,1<=i<=n。
操作结果:
在线性表L中删除序号为i的数据元素,
删除后使序号为i+1,i+2,...,n的元素变为序号为i,i+1,...,n-1,删除后新表长=原表长-1。
*/
intDelete_SeqList(SeqList1*L,inti)
{
intj;
if(i<1||i>L->last+1)
{
printf("元素不存在");
return0;
}
for(j=i;j<=L->last;j++)
{
L->data[j-1]=L->data[j];
}
L->last--;
return1;
}
/*按值查找:
Locate_List(L,x),x是给定的一个数据元素。
初始条件:
线性表L存在
操作结果:
在表L中查找值为x的数据元素,
其结果返回在L中首次出现的值为x的那个元素的序号或地址,称为查找成功;
否则,在L中未找到值为x的数据元素,返回一特殊值表示查找失败。
*/
intLocation_SeqList(SeqList1*L,datatype1x)
{
inty=0;
while(y<=L->last&&L->data[y]!
=x)
y++;
if(y>L->last)
return-1;
elsereturny+1;
}
voidprint1(SeqList1*L)//打印线性表
{inti;
for(i=0;i<=L->last;i++)
printf("%d,",L->data[i]);
printf("\n");
}
voidmain1()
{SeqList1*L;
inti,j,k;
datatype1x;
do
{printf("\n\n\n\n");
printf("\t\t\t线性表子系统\n");
printf("\t\t*******************************\n");
printf("\t\t*1----初始化表 *\n");
printf("\t\t*2----插入 *\n");
printf("\t\t*3----删 除 *\n");
printf("\t\t*4----查 找 *\n");
printf("\t\t*5----显 示 *\n");
printf("\t\t*0----返 回 *\n");
printf("\t\t*******************************\n");
printf("\t\t请选择菜单项(0-5):
");
scanf("%d",&k);getchar();
switch(k)
{
case1:
L=insert_SeqList();//初始化线性表
break;
case2:
//在线性表第i位置处插入值为X的元素
printf("\n请输入插入的位置i和数据X(输入格式:
i,X):
");
scanf("%d,%d",&i,&x);
j=Insert_SeqList(L,i,x);
if(j==1)printf("插入成功!
!
");
elseprintf("插入失败!
!
");
break;
case3:
//删除线性表中值为X的元素
printf("\n请输入要删除元素的位置i:
");
scanf("%d",&i);
j=Delete_SeqList(L,i);
if(j==1)printf("删除成功!
!
");
elseprintf("删除失败!
!
");
break;
case4:
//查找线性表中元素值为x的位置
printf("\n请输入要查找的数值X:
");
scanf("%d",&x);
j=Location_SeqList(L,x);
if(j!
=-1)
{print1(L);printf("中值为X所在的位置是%d",j);}
else
printf("线性表中无此元素!
!
\n");
break;
case5:
//输出线性表
printf("\n线性表的顺序存储为:
");
print1(L);
}
}while(k!
=0);
}
3.实验2---线性表的链式存储
#include"stdio.h"
#include"malloc.h"
#definedatatype2int
typedefstructnode
{datatype2data;//链表的数据域
structnode*next;//链表的指针域
}LNode2,*LinkList2;
LinkList2Creat_LinkList1()//头插入法建立单链表算法
{
datatype2c;
LinkList2head;
LNode2*p;
head=NULL;
printf("请输入数据");
scanf("%d",&c);
while(c!
=0)
{
p=(LNode2*)malloc(sizeof(LNode2));
p->data=c;
p->next=head;
head=p;
scanf("%d",&c);
}
returnhead;
}
/*按序号查找Get_Linklist(L,i)
在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
LNode2*Get_LinkList(LinkList2L,inti)
{
intj;
LNode2*p;
p=L;
j=0;
while(p->next&&j
{
p=p->next;
j++;
}
if(i==j)
{
returnp;
}
elsereturnNULL;
}
/*插入运算Insert_LinkList(L,i,x)
在单链表L的第i个位置上插入值为x的元素*/
intInsert_LinkList(LinkList2L,inti,datatype2x)
{
LNode2*p,*q;
p=Get_LinkList(L,i-1);
if(p==NULL)
{
printf("位置错误");
return0;
}
else
{
q=(LNode2*)malloc(sizeof(LNode2));
q->data=x;
q->next=p->next;
p->next=q;
return1;
}
}
/*删除运算:
Del_LinkList(L,i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 本科 毕业设计 论文 数据结构 课程设计