收藏 分享(赏)

数据结构课程设计.docx

上传人:dreamzhangning 文档编号:4029144 上传时间:2018-12-05 格式:DOCX 页数:56 大小:1.04MB
下载 相关 举报
数据结构课程设计.docx_第1页
第1页 / 共56页
数据结构课程设计.docx_第2页
第2页 / 共56页
数据结构课程设计.docx_第3页
第3页 / 共56页
数据结构课程设计.docx_第4页
第4页 / 共56页
数据结构课程设计.docx_第5页
第5页 / 共56页
点击查看更多>>
资源描述

1、算法与数据结构课程设计报告专 业: 班 级: 学 号: 姓 名: 指导教师: 目录1. 设计目的 12. 实验任务 13. 设计方案 23.1 整体设计 23.2 单链表的设计与实现 23.3 栈的设计与实现 63.4 数组的的设计与实现 163.5 二叉树的的设计与实现 263.6 图的的设计与实现 334. 评价与总结 535. 教师评阅意见 541课程设计报告1. 设计目的数据结构课程设计是为数据结构课程独立开设的实践性教学环节。数据结构课程设计对于巩固树结构知识,加强学生的 实际动手能力和提高学生的 综合素质是十分必要的。 课程设计目的:1提高数据抽象能力。根据实际问题,能利用数据结构

2、理论课中所学到的知识选择合适的逻辑结构以及存储结构,并 设计出有效解决问题的算法。2提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代 码中的错误并且修改。3初步了解开发过程中问题分析、整体设计、程序编码、 测试等基本方法和技能。2. 实验任务设计一个基于 DOS 菜单的应用程序。要求利用多级菜单实现各种功能。内容如下:1 单链表的基本操作及应用 创建 插入 删除 查找 显示2 栈的基本操作及应用 进栈 出栈 取栈顶元素 表达式的求解3 数组的基本操作及应用 创建 加法 减法 乘法 显示4 二叉树的基本操作及应用 创建二叉树 遍历二叉

3、树(先序、中序、后序) 计算叶子结点个数及树的深度 查找指定结点的双亲 查找指定结点的兄弟5 图的基本操作及应用 创建无向图 创建有向图 创建无向网2 创建有向网 遍历 拓扑排序 最小生成树 最短路径 关键路径3. 设计方案3.1 整体设计由于本设计是实现一个菜单管理系统,所以从需求出 发本程序在整体 设计和代码管理上采用分层式管理方法。其中程序入口 main 函数为程序的第一 层,旨在 负责程序的界面设计和局部功能函数的调用。各种数据 类型的功能实现函数 为第二层,它 们由五个用于对各类型数据结构和操作函数声明的头文件,以及五个独立的源代码文件构成。其 结构关系如下:3.2 单链表的设计与实

4、现实现原理:单链表是一种链式存取的数据结构,相比于 顺序结构的优 点在于, 链式存储结构用一组地址任意的存储单元存放线性表中的数据元素。 单链表中每个 结点的存储地址是存放在其前趋结点 next 域中,所以单链 表的插入删除操作也是对其 next 域进行操作。而开始结点无前趋,故应设头指针 head 指向开始结点。单链表的插入原理是先将待插入节点的 next 指向待插入位置的后一个节点,然后将待插入位置的前一个节点的 next 指向待插入节点则完成了节点的插入。单链表的删除原理是先在单链表中找到待删除节点的前驱,然后将待删除节点的前驱的 next 指向待删除节点的后继则完成了单链表中节点的删除

5、。3实现代码:LinkList.h#ifndef LinkList_H#define LinkList_Htypedef struct ListNodechar data;struct ListNode *next;ListNode, *LinkList;LinkList CreateList(LinkList L);void InsertList(LinkList L);void DeleteList(LinkList L);void GetElem(LinkList L);void ShowList(LinkList L);#endifLinkLIst.cpp#include#includ

6、e#include“LinkList.h“LinkList CreateList(LinkList L)char c;LinkList p;LinkList q;L = (LinkList)malloc(sizeof(ListNode);L-next = NULL;q = L;printf(“链表创建完成,请 初始化链表内容( 以#结束):n“);c = getchar();while (c != #)p = (LinkList)malloc(sizeof(ListNode);p-data = c;p-next = NULL;q-next = p;q = q-next;/p-next = L-

7、next;4/L-next = p;c = getchar();return L;void InsertList(LinkList L)int n;LinkList p;LinkList q = L;p = (LinkList)malloc(sizeof(ListNode);printf(“请输入插入元素:“);fflush(stdin); /清空输入缓冲区scanf_s(“%c“, printf(“请输入插入位置:“);scanf_s(“%d“, for (int i = 0; inext;p-next = q-next;q-next = p;void DeleteList(LinkList

8、 L)bool DelElem=false;char c;LinkList p = L;printf(“请输入需要删除的元素:“);fflush(stdin); scanf_s(“%c“, while (p-next)if (p-next-data = c)p-next = p-next-next;DelElem = true;p = p-next;if (!DelElem)5printf(“链表中无此元素!n“);void GetElem(LinkList L)bool FindElem = false;int n = 1;char c;LinkList p = L-next;printf(

9、“请输入需要查找的元素:“);fflush(stdin);scanf_s(“%c“, while (p)if (p-data = c)FindElem = true;printf(“第%d 个元素是您要查找的元素%cn“, n, c);p = p-next;n+;if (!FindElem) printf(“该链表中没有您查询的元素!n“);getchar();void ShowList(LinkList L)LinkList p;p = L-next;printf(“n 当前链表中的元素为:n“);while (p)printf(“%c “, p-data);p = p-next;print

10、f(“n“);getchar();结果展示:6单链表的创建,本函数采用前插的方式 创建单链表,并按逆序(创建输入顺序)将其内容输出给用户。单链 表插入 单链 表 删 除3.2 栈的设计与实现实现原理:栈是一种操作受限的线性表,它只能在表尾 进行插入和 删除操作。 栈的基本操作入栈,出栈和取栈顶元素都是对栈的 top 指针进行操作完成的。当需要入栈的时候,将等待入 栈的数据赋值到 top 指针所指向的数据单元,并将 top 指针向后移动一位。出栈则只需要将 top 指针前移一位即可。使用栈进行表达式求值则是分别建立符号栈和数字栈,当表达式中 输入的字符为数字时直接 进入数字栈。当 输入的字符为运

11、算符时,先比较待入运算符与 栈顶运算符的优先级,若高于栈顶元素的优先级则直接入栈,若低于栈顶元素则先运算栈顶元素再入栈。实现代码:Stack.h7#ifndef Stack_H#define Stack_Htypedef struct stackchar *base;char *top;int stacksize;stack;typedef struct num_stackdouble *base;double *top;int stacksize;num_stack;void Push(stack void Pop(stack void GetTop(stack S);void Expres

12、sion();#endifStack.cpp#include#include#include#include“Stack.h“#define STACKSIZE 10#define STACKINCREMENT 10void show(stack S);void CreateStack(stack void CreateStack(num_stack void num_push(num_stack void sym_push(stack void Operation(stack void sum(stack void Push(stack int n;8if (S.stacksize = 0)

13、S.base = (char *)malloc(STACKSIZE*sizeof(char);if (S.base = NULL)printf(“栈初始化失败!“);return;else*S.base = 0;S.stacksize = STACKSIZE;S.top = S.base;printf(“请输依次入栈序列,以 #结束:“);fflush(stdin);scanf_s(“%c“, while (c != #)if (S.top - S.base = S.stacksize)n = S.top - S.base;S.base = (char*)realloc(S.base, (S.

14、stacksize + STACKINCREMENT)*sizeof(char);S.top = S.base + n;S.stacksize = S.stacksize + STACKINCREMENT;*S.top = c;S.top+;scanf_s(“%c“, show(S);void Pop(stack elseS.top-;printf(“栈顶元素%c 已出栈。“, *S.top);show(S);9void GetTop(stack S)if (S.top = S.base)printf(“该栈已经为空!“);elseprintf(“栈顶元素为:%c“, *(S.top - 1)

15、;fflush(stdin);getchar();void show(stack S)if (S.top - S.base 0)printf(“n 当前栈中元素为:n“);for (char* p = S.base; p = 0num.base = (double*)realloc(num.base, (num.stacksize + STACKINCREMENT)*sizeof(double);num.top = num.base + n;num.stacksize = num.stacksize + STACKINCREMENT;*num.top = number*pow(0.1, f_p

16、ower);num.top+;number = 0;f_power = 0;f_judge = false;void sym_push(stack if (sym.top - sym.base = sym.stacksize)n = sym.top - sym.base;sym.base = (char*)realloc(sym.base, (sym.stacksize + STACKINCREMENT)*sizeof(char);sym.top = sym.base + n;sym.stacksize = sym.stacksize + STACKINCREMENT;14*sym.top =

17、 c;sym.top+;void Operation(stack num.top-;sym.top-;break;case -:*(num.top - 2) = *(num.top - 2) - (*(num.top - 1);num.top-;sym.top-;break;case *:*(num.top - 2) = *(num.top - 2) * (*(num.top - 1);num.top-;sym.top-;break;case /:*(num.top - 2) = *(num.top - 2) /(*(num.top - 1);num.top-;sym.top-;break;/

18、case (:/break;default:break;结果展示:153.3 数组的设计与实现实现原理:16本部分使用三元组实现稀疏矩阵的存储,并在此基 础 上完成矩阵的加、减以及乘法运算。用三元组实现矩阵的加减的本质是将两个三元组中行列位置相等的值进行加减,最终存储到另一个三元组中。三元 组的乘法是按照矩阵乘法的原理不停的遍 历查找和计算来求解每一个对应值的过程。实现代码:Array.h#ifndef Array_H#define Array_Htypedef struct Tripleint row, col;int val;Triple;typedef structTriple data

19、101;int mu, nu, tu;TSMatrix;void CreateArray(TSMatrix void ShowArray(TSMatrix M);void ArraySum();void ArraySub();void ArrayProduct();#endiArray.cpp#include17#include“Array.h“#define maxsize 100void Sort(TSMatrix /-创建三元组矩阵-void CreateArray(TSMatrix printf(“请依次输入矩阵的行、列和三元 组的个数:“);scanf_s(“%d%d%d“, if

20、(M.tu maxsize)printf(“您所输入的三元组个数超出最大上限, 请重新输入!“);fflush(stdin);getchar();return;else printf(“请输入三元组内容:nrowtcoltvaltn“);for (int k = 0; kM.mu | col M.nu)printf(“您输入的行或列超出预定范围!“);fflush(stdin);getchar();return;elseM.datak.row = row;M.datak.col = col;M.datak.val = e;Sort(M);void Sort(TSMatrix bool chan

21、ge = true;for (int i = 1; i M.dataj + 1.row)node = M.dataj;M.dataj = M.dataj + 1;M.dataj + 1 = node;change = true;else if (M.dataj.row = M.dataj + 1.row)if (M.dataj.col M.dataj + 1.col)node = M.dataj;M.dataj = M.dataj + 1;M.dataj + 1 = node;change = true;else if (M.dataj.col = M.dataj + 1.col)printf

22、(“您输入的矩阵有冲突!n“);/矩阵内部排序/-矩阵加法-void ArraySum()TSMatrix M, N, Q;Triple* m;Triple* n;Triple* q;printf(“请输入被加数矩阵:n“);CreateArray(M);printf(“请输入加数矩阵:n“);CreateArray(N);m = n = q = Q.mu = M.mu;Q.nu = M.nu;19Q.tu = 0;int i = 0;int j = 0;while (i (*n).row)(*q) = (*n);n+;j+;q+;Q.tu+;else if (*m).row = (*n).r

23、ow)if (*m).col (*n).col)(*q) = (*n);n+;j+;q+;Q.tu+;else if (*m).col = (*n).col)if (*m).val + (*n).val)(*q) = (*m);(*q).val = (*m).val + (*n).val;q+;Q.tu+;n+;j+;m+;i+;elsen+;j+;m+;i+;else(*q) = (*m);m+;i+;q+;20Q.tu+;else(*q) = (*m);m+;i+;q+;Q.tu+;while (i (*n).row)(*q) = (*n);(*q).val = 0 - (*q).val;

24、n+;j+;q+;Q.tu+;else if (*m).row = (*n).row)if (*m).col (*n).col)(*q) = (*n);(*q).val = 0 - (*q).val;n+;j+;q+;Q.tu+;else if (*m).col = (*n).col)if (*m).val - (*n).val)(*q) = (*m);(*q).val = (*m).val - (*n).val;q+;Q.tu+;n+;j+;m+;i+;elsen+;j+;22m+;i+;else(*q) = (*m);m+;i+;q+;Q.tu+;else(*q) = (*m);m+;i+

25、;q+;Q.tu+;while (i #include#include“BiTree.h“int PreOrderTraverse(Tree int InOrderTraverse(Tree int PostOrderTraverse(Tree int Depth(Tree void Leaf(Tree int Parent(Tree int Sibling(Tree /-创建二叉树-void CreateBiTree(Tree ch = getchar();if (ch = )T = NULL;elseif (!(T = (BiTNode *)malloc(sizeof(BiTNode) e

26、xit(0);T-data = ch;CreateBiTree(T-lchild);CreateBiTree(T-rchild);/以先序方式创建二叉树/-二叉树遍历-void Traverse(Tree T)printf(“先序序列为:“);PreOrderTraverse(T);printf(“n“);printf(“中序序列为:“);InOrderTraverse(T);printf(“n“);printf(“后序序列为:“);PostOrderTraverse(T);printf(“n“);fflush(stdin);getchar();28int PreOrderTraverse(Tree if (PreOrderTraverse(T-lchild)if (PreOrderTraverse(T-rchild)return 1;return 0;else return 1;/先序遍历二叉树int InOrderTraverse(Tree if (InOrderTraverse(T-rchild) return 1;return 0;else return 1;/中序遍历二叉树int PostOrderTraverse(Tree return 1;return 0;else return 1;/后序遍历二叉树

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 课程设计

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报