一.设计目的
1.提高数据抽象能力。根据实际问题,能利用数据结构理论课中所学到的知识选择合适的逻辑结构以及存储结构,并设计出有效解决问题的算法。
2.提高程序设计和调试能力。学生通过上机练习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3.初步了解开发过程中问题分析、整体设计、程序编码、测试等基本方法和技能。
二.设计任务
设计一个基于DOS菜单的应用程序。要求利用多级菜单实现各种功能。内容如下:
- 单链表的基本操作及应用
- 创建
- 插入
- 删除
- 查找
- 显示
- 通讯录设计(应用)
- 栈的基本操作及应用
- 进栈
- 出栈
- 取栈顶元素
- 表达式的求解(应用)
- 数组的基本操作及应用
- 创建
- 显示
- 矩阵乘法(应用)
- 二叉树的基本操作及应用
- 创建二叉树
- 遍历二叉树(先序、中序、后序)
- 计算叶子结点个数及树的深度
- 查找指定结点的双亲
- 查找指定结点的兄弟
- Huffman编码(应用)
- 图的基本操作及应用
- 创建无向图
- 创建有向图
- 创建无向网
- 创建有向网
- 遍历
- 拓扑排序
- 最小生成树(应用)
- 最短路径(应用)
- 关键路径(应用) 第一步:根据设计任务,设计DOS菜单。
// 数据结构 课程设计.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include<stdlib.h> #include<stdio.h> #include<iostream> using namespace std; #include"linklist.h"//包含单链表的相关自定义头文件 #include"stack.h"//包含栈的相关自定义头文件 #include"array.h"//包含数组的相关自定义头文件 #include"bitree.h"//包含树的相关自定义头文件 #include"graph.h"//包含图的相关自定义头文件 #include"topu.h" //主菜单打印函数 void ShowMainMenu() { printf("\n"); printf("*******************算法与数据结构******************\n"); printf("* 1 单链表的基本操作及应用 *\n"); printf("* 2 栈的基本操作及应用 *\n"); printf("* 3 数组的基本操作及应用 *\n"); printf("* 4 树的基本操作及应用 *\n"); printf("* 5 图的基本操作及应用 *\n"); printf("* 6 退出 *\n"); printf("***************************************************\n"); } // 1.单链表操作/// void LinkList() { int n; List L; L = (LNode*)malloc(sizeof(LNode));//给头结点分配内存空间 printf("\n"); printf("**************单链表的基本操作及应用***************\n"); printf("* 1 创建 *\n"); printf("* 2 插入 *\n"); printf("* 3 删除 *\n"); printf("* 4 查找 *\n"); printf("* 5 显示 *\n"); printf("* 6 通讯录(应用) *\n"); printf("* 7 退出 *\n"); printf("***************************************************\n"); do { printf("请选择:"); scanf_s("%d", &n); switch (n) { case 1: printf("--------创建单链表---------"); std::cout << endl; L->next = NULL;//建立一个带头结点的空链表 std::cout << "请输入数据个数:"; int Linklist_Cx; cin >> Linklist_Cx; std::cout << "请输入数据" << endl; L = CreateList(L, Linklist_Cx); break; case 2: printf("--------插入元素-------"); std::cout << endl; std::cout << "开始在第i个位置插入元素e" << endl; int i, e; std::cout << "请给i赋值"; cin >> i; std::cout << "请给e赋值"; cin >> e; ListInsert(L, i, e); std::cout << "插入元素完成!" << endl; break; case 3: printf("--------删除元素-------"); std::cout << endl; std::cout << "删除操作开始" << endl; std::cout << "请给i赋值"; cin >> i; std::cout << "删除的值为" << ListDelete(L, i) << endl; std::cout << "删除操作完成!" << endl; break; case 4: printf("--------查找元素-------"); std::cout << endl; std::cout << "查找操作开始" << endl; std::cout << "请给i赋值"; cin >> i; std::cout << "查找的值为" << GetElem(L, i) << endl; std::cout << "查找完成完成!" << endl; break; case 5: printf("--------显示链表-------"); std::cout << endl; print(L); std::cout << "单链表输出完成!" << endl; std::cout << endl; break; case 6: {system("pause"); system("cls"); printf("--------通讯录---------"); std::cout << endl; Adress_book(); } break; case 7: std::cout << "退出程序" << endl; break; default: printf("ERROR!"); break; } } while (n != 7); } / /2.栈的基本操作及应用函数/ /// void Sstack() { Stack s; int n; printf("\n"); printf("****************栈的基本操作及应用*****************\n"); printf("* 1 进栈 *\n"); printf("* 2 出栈 *\n"); printf("* 3 取栈顶元素 *\n"); printf("* 4 表达式求解(应用) *\n"); printf("* 5 退出 *\n"); printf("***************************************************\n"); initStack(&s); cout << "栈(含有三个数据)构建完成!" << endl; for (int i = 10; i < 13; i++) { Push(&s, i); } do { printf("请选择:"); scanf_s("%d", &n); switch (n) { case 1: printf("--------进栈-------"); cout << endl; int x; cout << "入栈数据为x="; cin >> x; Push(&s, x); cout << "入栈操作完成" << endl; printfStack(&s); break; case 2: printf("--------出栈-------"); std::cout << endl; std::cout << "出栈元素为" << Pop(&s,x) << endl; printfStack(&s); break; case 3: printf("--------取栈顶元素-------"); cout << endl; cout << "栈顶元素为" << Getpop(&s) << endl; printfStack(&s); break; case 4: printf("--------表达式求值-------"); cout << endl; printf("请输入要计算的表达式(操作数和结果都在0-9的范围内,以#结束):"); //EvaluateExpression();表达式求值函数 printf("计算结果为%d\n", EvaluateExpression() - 48); break; case 5: cout << "退出程序" << endl; system("pause"); break; default: printf("ERROR!"); break; } } while (n != 5); } // //3.稀疏矩阵的压缩存储/ void Array() { TsMatrix T; int n; printf("\n"); printf("*************稀疏矩阵的压缩存储及应用**************\n"); printf("* 1 创建 *\n"); printf("* 2 显示 *\n"); printf("* 3 退出 *\n"); printf("***************************************************\n"); do { printf("请选择:"); scanf_s("%d", &n); switch (n) { case 1: printf("---------创建-------"); cout << endl; GreatTriple(T); std::cout << "创建完成!"<<endl; break; case 2: printf("---------显示-------"); std::cout << endl; Show(T); std::cout << "打印完成!" << endl; break; case 3: std::cout << "退出程序" << endl; break; default: printf("ERROR!"); break; } } while (n != 3); } // ///4.二叉树的基本操作及应用 void BiTree() { BinTree T = NULL; int n; printf("\n"); printf("**************二叉树的基本操作及应用***************\n"); printf("* 1 创建二叉树 *\n"); print