《算法与数据结构》课程设计

本课程设计旨在提高数据抽象和程序设计能力,要求学生设计一个基于DOS菜单的程序,涵盖单链表、栈、数组、二叉树和图等数据结构的基本操作与应用,包括创建、插入、删除、查找、显示等功能,以及在通讯录、表达式求解、矩阵乘法、Huffman编码、最短路径等问题上的应用。设计过程中,学生将经历问题分析、整体设计、编码和测试等步骤。
摘要由CSDN通过智能技术生成

一.设计目的

1.提高数据抽象能力。根据实际问题,能利用数据结构理论课中所学到的知识选择合适的逻辑结构以及存储结构,并设计出有效解决问题的算法。

2.提高程序设计和调试能力。学生通过上机练习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

3.初步了解开发过程中问题分析、整体设计、程序编码、测试等基本方法和技能。

二.设计任务

设计一个基于DOS菜单的应用程序。要求利用多级菜单实现各种功能。内容如下:

  1. 单链表的基本操作及应用
  • 创建
  • 插入
  • 删除
  • 查找
  • 显示
  • 通讯录设计(应用)
  1. 栈的基本操作及应用
    • 进栈
    • 出栈
    • 取栈顶元素
    • 表达式的求解(应用)
  2. 数组的基本操作及应用
  • 创建
  • 显示
  • 矩阵乘法(应用)
  1. 二叉树的基本操作及应用
    • 创建二叉树
    • 遍历二叉树(先序、中序、后序)
    • 计算叶子结点个数及树的深度
    • 查找指定结点的双亲
    • 查找指定结点的兄弟
    • Huffman编码(应用)
  2. 图的基本操作及应用
    • 创建无向图
    • 创建有向图
    • 创建无向网
    • 创建有向网
    • 遍历
    • 拓扑排序
    • 最小生成树(应用)
    • 最短路径(应用)
    • 关键路径(应用)                                                                                                         第一步:根据设计任务,设计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
  • 8
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代号凌凌漆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值