数据结构大作业
数据结构大作业
南昌大学实验报告实验名称:线性表的顺序存储实现及链式存储实现学生姓名:学号:80023120 专业班级:电子商务121班实验类型:□验证□综合□设计□创新实验目的1.熟悉掌握线性表的两种存储实现方式。
2.熟悉掌握线性表的两种存储实现方式下的一些基本操作。
试验内容1.写出顺序表的class和一些关于顺序表的操作函数。
2.写出单链表的class和一些关于单链表的操作函数。
3.写出双向链表的class和一些关于双向链表的操作函数。
4.测试类中实现的操作函数。
实验步骤1、顺序表类是指采用顺序存储结构来表示线性表的类。
线性表采用顺序存储结构,其数组和线性表长可以作为类的数据成员。
创建一个类const int MAXSIZE=100; //数组的容量最大值为100class SqList{ private:ElemType elem[MAXSIZE]; //数组int length; //线性表长public:SqList( void); //构造函数~SqList(){ }; //析构函数void Creat() ; //初建一个简表函数void PrintOut(); //输出线性表函数void Insert( int i, ElemType e); //插入函数ElemType Delet(int i); //删除函数};//类定义结束{ cout<<"\n Input length="; cin>>length;cout<<"\n Input Data:\n" ;for(int k=0; k<length;k++) cin>>elem[k];}void SqList::PrintOut() //输出线性表函数{cout<<"\n length="<<length ;cout<<"\n PrintOut Data:\n" ;for(int k=0; k<length;k++) cout<<setw(6)<<elem[k];cout<<endl;}2、单链表:假设一个线性表有n个元素,则这n个元素所对应的n个节点就通过指针(是计算机内某个存储单元的地址)链接成一个链表由于这种链表中每个节点只有一个指针域,故称为单链表。
西南大学网教 (0012)《数据结构》大作业A 答案
则关键字为49的地址为。
9)数据结构被形式地定义为(D, R),其中D是的有限集合,R是D上的有限集合。
10)一个算法的效率分为效率和效率。
3、应用题1)编写算法,将一个头指针为head不带头结点的单链表改造为一个单向循环链表,并分析算法的时间复杂度。
2)已知二叉树的先序遍历序列为ABCDEFGH,中序遍历序列为CBEDFAGH,画出二叉树。
然后写出该二叉树的后序遍历序列。
3)试用权集合{12,4,5,6,1,2}构造哈夫曼树,并计算哈夫曼树的带权路径长度。
4)已知图G如下所示,根据Prim算法,构造最小生成树。
(要求给出生成过程)5)设哈希表HT表长m为13,哈希函数为H(k)=k MOD m,给定的关键值序列为{19,14,23,10,68,20,84,27,55,11}。
试求出用线性探测法解决冲突时所构造的哈希表,并求出在等概率的情况下查找成功的平均查找长度ASL。
二、大作业要求大作业共需要完成22道题:第1大题必做,满分30分;第2大题必做,满分30分;第3大题选作2题,满分40分。
答卷提交要求:考试题提前公布,学生下载试题和答题卷后,在答题卷上答题。
完成后需网上提交答卷。
答卷于11月20日--12月6日通过点击页面左侧导航栏内“我的考试”-“课程论文/大作业”提交。
1、选择题1) C 2) C 3) D 4) A 5) C6) C 7) B 8) D 9) A 10) A2、填空题1) l==l->next2)栈顶3)三元组顺序表十字链表。
4)LOC (A[0][0])+(n*i+j)*k5)R[2i+1]6) 先序遍历7)n-18)99) 数据元素关系10)时间效率空间效率3、应用题2)已知二叉树的先序遍历序列为ABCDEFGH,中序遍历序列为CBEDFAGH,画出二叉树。
然后写出该二叉树的后序遍历序列。
答:后序遍历序列CEFDBHGA3)试用权集合{12,4,5,6,1,2}构造哈夫曼树,并计算哈夫曼树的带权路径长度。
数据结构大作业3
数据结构大作业一、大作业的性质和目的数据结构大作业是对软件设计的综合训练,包括问题分析、总体设计、用户界面设计、程序设计基本技能和技巧,以至一套软件工作规范的训练和科学作风的培养。
在数据结构实验中,完成的只是单一而“小”的算法,而本课程设计是对学生的整体编程能力的锻炼。
数据结构大作业的目的是训练学生对问题的抽象能力和算法的运用能力。
二、大作业安排每位同学独立完成,可自选题目或根据选择后面的一个参考题目来完成。
开学第一周统一提交到教学在线。
提交的内容包括:(1)设计报告文档。
该文档是评分的重要依据之一,请认真对待。
该文档包括如下内容:●需求分析: (陈述要解决的问题,要实现的功能),●详细设计:包括设计算法流程图、算法分析、使用的数据结构(要求详细论证);●软件测试:包括测试数据和测试结果记录●总结:设计过程中遇到的问题及解决方法;尚未解决的问题及考虑应对的策略;收获和心得;(2)源代码。
要求注释清晰,编写规范,模块化。
(3)可运行的exe文件。
要求充分测试,在XP操作系统中能正常运行。
以上内容打包后提交到教学在线。
三、考核和成绩评定老师根据设计文档、源代码和可执行文件,进行判分。
对于出现以下情况的学生,要求统一进行答辩:●执行文件无法正常运行。
●源程序疑似抄袭。
如果有发现两个同学的代码相类似则需要共同出席答辩。
如果判定抄袭,则为不及格。
开发过程可以部分复用网上的开源代码,但必须体现自己的工作,如果没有自己工作的部分,同样判为抄袭。
五、题目(任选其中之一或自拟)1. 数字化校园(1)设计华南理工大学的校园平面图,至少包括10个以上的地点,每两个地点间可以有不同的路,且路长可能不同。
以图中顶点表示校内各地点,存放名称、代号、简介等信息;用边表示路径,存放路径长度等相关信息。
(2)提供图中任意地点相关信息的查询。
(3)提供图中任意地点的问路查询,即查询任意两个地点之间的一条最短路径。
(4)学校要新建一间超市,请为超市选址,实现总体最优。
数据结构作业及参考答案(最新版)
数据结构一、选择题1.数据的存储结构是指( )。
A 存储在外存中的数据 B 数据所占的存储空间C 数据在计算机中的顺序存储方式D 数据的逻辑结构在计算机中的表示 2.下列关于栈的描述中错误的是( )。
A 栈是先进后出的线性表B 栈只能顺序存储C 栈具有记忆作用D 对栈的插入与删除操作中,不需要改变栈底指针 3.用链表表示线性表的优点是( )。
A 便于随机存取B 花费的存储空间较顺序存储少C 便于插入和删除操作D 数据元素的物理顺序与逻辑顺序相同 4.在下面关于线性表的叙述中,选出正确的一项( )。
A 线性表的每个元素都有一个直接前驱和直接后继;B 线性表中至少要有一个元素;C 线性表中的元素必须按递增或递减的顺序排列;D 除第一个元素和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继。
5.设在栈中,由顶向下已存放元素c b a ,在第4个元素d 入栈前,栈中元素可以出栈,试问d 入栈后,不可能的出栈序列是 ( )。
A d c b a B c b d aC c a d bD c d b a6.在下列关于二叉树的叙述中,选出正确的一项( )。
A 在二叉树中,任何一个结点的度都是2;B 二叉树的度为2;C 在二叉树中至少有一个结点的度是2D 一棵二叉树的度可以小于27.下面的二叉树中,( )不是完全二叉树。
8.有一棵非空的二叉树(第0层为根结点),其第i 层上至多有多少个结点 ( )。
A 2iB 2i-1C 2i+1D i9.线性表的逻辑顺序与存储顺序总是一致的,这种说法 ( )。
A 正确B 不正确10.深度为k 的二叉树,所含叶子的个数最多为 ( )。
A 2KB KC 2k-1D 2k-111.深度为5的二叉树至多有( )个结点。
A 16B 32C 31D 1012.在下面关于线性表的叙述中,选出错误的一项( )。
A 采用顺序存储的线性表,必须占用一片连续的存储单元B 采用顺序存储的线性表,便于进行插入和删除操作C 采用链接存储的线性表,不必占用一片连续的存储单元D 采用链接存储的线性表,便于进行插入和删除操作13.已知一棵二叉树的前序遍历结果为ABCDEF ,中序遍历结果为CBAEDF ,则后序遍历的结果为( )。
数据结构大作业
数据结构作业(1)年级:2004级(2)班专业:计算机科学与技术专业学号:200431500066姓名:秦博纯病人看病模拟程序编写一个程序,反映病人到医院看病,排队看医生的情况。
在病人排队过程中,主要重复两件事:1.病人到达诊室,将病历本交给护士,排到等待队列中候诊。
2.护士从等待队列中取出下一们病人的病历,该病人进入人诊室就诊。
要求模拟病人等待这一过程,程序采用菜单方式,其选项及功能说明如下:a.排队——输入排队病人的病历号,加入病人排队队列中;b.就诊——病人排队队列中最前面的病人就诊,并将其从队列中删除;c.查看排队——从队首到队尾列出所有的排队病人的病历号;d.不再排队,余下依次就诊——从队首到队尾列出所有的排队病人的病历号,并退出运行;e.下班——退出运行。
解:本项目的组成结构如图1所示,本程序的模块结构图如图2所示,图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系,虚线方框表示文件的组成,即指出该虚线方框中的函数存放在哪个文件中。
文件包含如下函数:. SeeDoctor():模拟病人看病的过程。
病人排队看医生,所以要用到一个队列,这里设计了一个不带头结点的单链表作为队列。
源程序如下:图1 项目组成#include<stdio.h>#include<malloc.h>typedef struct qnode{int data;struct qnode *next;}QNode;typedef struct{QNode *front,*rear;}QuType; 图2 项目的程序结构图void SeeDoctor(){int sel,flag=1,find,no;QuType *qu;QNode *p;qu=(QuType *)malloc(sizeof(QuType)); /*创建空队*/qu->front=qu->rear=NULL;while(flag==1) /*循环执行*/{printf("1:排队2:就诊3:查看排队4:不再排队,余下依次就诊5:下班请选择");scanf("%d",&sel);switch(sel){case 1:printf(">>输入病历号:");do{scanf("%d",&no);find=0;p=qu->front;while(p!=NULL&&!find){if(p->data==no)find=1;elsep=p->next;}if(find)printf(">>输入的病历号重复,重新输入:");}while(find==1);p=(QNode *)malloc(sizeof(QNode)); /*创建结点*/p->data=no;p->next=NULL;if(qu->rear==NULL) /*第一个病人排队*/ {qu->front=qu->rear=p;}else{qu->rear->next=p; /*将*p结点入队*/qu->rear=p;}break;case 2: /*队空*/ if(qu->front==NULL)printf(">>没有排队的病人!\n");else /*队不空*/{p=qu->front;printf(">>病人%d就诊\n",p->data);if(qu->rear==p) /*只有一个病人排队*/{qu->front=qu->rear=NULL;}elsequ->front=p->next;free(p);}break;case 3: /*队空*/ if(qu->front==NULL)printf(">>没有排列的病人!\n");else /*队不空*/{p=qu->front;printf(">>排队病人: ");while(p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");}break;case 4: /*队空*/ if(qu->front==NULL)printf(">>没有排队的病人!\n");else /*队不空*/{p=qu->front;printf(">>病人按以下顺序就诊: ");while(p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");}flag=0; /*退出*/break;case 5: /*队不空*/ if(qu->front!=NULL)printf(">>请排队的病人明天就医!\n");flag=0; /*退出*/break;}}}void main(){SeeDoctor();}程序运行结果如下:。
数据结构大作业
数据结构大作业在计算机科学领域中,数据结构是非常重要的一个概念。
它是指组织和存储数据的方式,以及对数据进行操作的方法。
数据结构的选择与实现直接影响着算法的复杂度和程序的性能。
因此,在学习数据结构的过程中,一般都会有相应的大作业,以帮助学生更好地理解和应用所学的知识。
本篇文章将重点介绍数据结构大作业的一般要求和一种可能的实现方案,供读者参考。
一、数据结构大作业要求数据结构大作业一般旨在让学生将所学的数据结构知识应用于实际问题的解决。
作业要求通常包括以下几个方面:1. 题目选择:作业题目需要涵盖数据结构的各个方面,例如链表、栈、队列、树、图等等。
题目应具备一定的难度,能够考察学生对数据结构的理解和运用能力。
2. 实现方式:学生需要根据题目要求选择合适的数据结构和算法,并进行实现。
一般要求使用编程语言来完成实现,并给出相应的代码。
3. 功能要求:作业题目通常会要求实现某些特定的功能或解决某些问题。
学生需要确保所实现的程序能够满足这些功能需求,并能正确运行。
4. 性能评估:作业可能会要求对所实现的程序进行性能评估,比如时间复杂度、空间复杂度等。
学生需要能够分析和解释程序的性能,并对可能的改进方法进行讨论。
5. 报告撰写:作业一般要求学生完成一份报告,对所实现的程序进行详细的说明和分析。
报告需要包括程序设计思路、实现细节、运行结果以及遇到的问题和解决方法等。
二、数据结构大作业实现方案示例以下是一个可能的数据结构大作业实现方案示例,以一个简化的社交网络系统为题目:1. 题目描述:设计一个基于图的社交网络系统,能够实现用户的注册、好友关系的建立和查询、用户之间的消息传递等功能。
2. 数据结构选择:可以使用图的数据结构来存储用户和好友关系的信息,使用链表来存储用户的消息队列。
3. 算法实现:根据题目要求,需要实现用户注册、好友关系的建立和查询、消息传递等功能的算法。
可以使用深度优先搜索或广度优先搜索算法来查找用户的好友关系,使用链表来实现用户消息的发送和接收。
数据结构作业题及参考答案
东北农业大学网络教育学院数据结构作业题(一)一、选择题(每题2分,共20分)1.在一个长度为n的顺序表的任一位置插入一个新元素的渐进时间复杂度为()。
A、O(n)B、O (n/2)C、O (1)D、O (n2)2.带头结点的单链表first为空的判定条件是()。
A、first == NULL;B、first->link == NULL;C、first->link == first;D、first != NULL;3.在一棵树中,()没有前驱结点。
A、分支结点B、叶结点C、树根结点D、空结点4.在有向图中每个顶点的度等于该顶点的()。
A、入度B、出度C、入度与出度之和D、入度与出度之差5.对于长度为9的有序顺序表,若采用折半搜索,在等概率情况下搜索成功的平均搜索长度为()的值除以9。
A、20B、18C、25D、226.下列程序段的时间复杂度为()。
s=0;for(i=1;i<n;i++)for(j=1;j<n;j++)s+=i*j;A、O (1)B、O (n)C、O (2n)D、O (n2)7.栈是一种操作受限的线性结构,其操作的主要特征是()。
A、先进先出B、后进先出C、进优于出D、出优于进8.假设以数组A[n]存放循环队列的元素,其头、尾指针分别为front和rear。
若设定尾指针指向队列中的队尾元素,头指针指向队列中队头元素的前一个位置,则当前存于队列中的元素个数为()。
A、(rear-front-1)%nB、(rear-front)%nC、(front-rear+1)%nD、(rear-front+n)%n9.高度为5的完全二叉树中含有的结点数至少为()。
A、16B、17C、31D、3210.如图所示有向图的一个拓扑序列是( )A、ABCDEFB、FCBEADC、FEDCBAD、DAEBCF二、填空题(每空1分,共20分)1.n (n﹥0) 个顶点的无向图最多有条边,最少有条边。
《数据结构》大作业
《数据结构》大作业
数据结构是计算机科学中构建可靠计算机系统所必需的基础知识。
它主要是用来处理
非常大的量级的数据,并为用户快速访问,高效的解决计算机问题。
由于中央处理机的特
点是高速而有效,起到了极大的性能提升。
数据结构有很多不同的结构,其中最重要的是线性结构和非线性结构。
线性结构又可
以分为数组、单向链表、双向链表和循环链表;非线性结构可以分为二叉树、二叉搜索树、B树、堆、红黑树和图。
在实际计算机程序中,数据结构一般被用来搜索和排序存储的数据,这些操作有助于
提高计算机的运行效率。
如果用户想要查找某一个数据,可以在合适的存储结构中找到它;如果用户希望把一系列数据按照某种顺序排列起来,也可以使用数据结构进行排序。
同时数据结构还可以用于实现数据结构间的转换,使得用户可以较为方便的获得数据。
它的运用,更加方便了计算机的工作,更加提高了计算机的性能。
总之,数据结构是计算机科学中重要的组成部分,它为计算机的工作提供了重要的基础,更加方便了用户的操作,也帮助用户更好地完成计算机系统中的各种工作和解决方案。
数据结构大作业
数据结构大作业平衡二叉树是一种特殊的二叉树结构,在插入或删除节点时,通过旋转操作来保持树的平衡性,从而提高查找、插入或删除操作的效率。
平衡二叉树的一种常见实现方式是AVL树。
AVL树是由俄罗斯数学家Adelson-Velsky和Landis于1962年提出的,它是一种自平衡的二叉树。
在AVL树中,每个节点的左右子树的高度之差(也称为平衡因子)不超过1、当插入或删除节点后导致一些节点的平衡因子超过1时,就需要通过旋转操作进行平衡调整。
具体来说,插入节点时,需要首先将节点插入到AVL树的合适位置。
然后,自底向上地检查每个节点的平衡因子。
如果发现一些节点的平衡因子超过1,则需要进行相应的旋转操作,使树重新恢复平衡。
旋转操作有四种基本情况,分别是LL、RR、LR和RL旋转。
LL旋转发生在一些节点的左子树的左子树上,RR旋转发生在一些节点的右子树的右子树上,LR旋转发生在一些节点的左子树的右子树上,RL旋转发生在一些节点的右子树的左子树上。
通过这些旋转操作,可以使树重新平衡。
删除节点时,需要先找到待删除的节点,并根据其子树的情况进行删除操作。
然后,从被删除节点的父节点向上检查每个节点的平衡因子,如果发现不平衡的节点,也需要进行相应的旋转操作。
AVL树的平衡调整是通过旋转操作来实现的,旋转操作的时间复杂度为O(1),因此平衡调整的时间复杂度为O(logn),其中n为树的节点数。
平衡二叉树的优点是能够保持树的平衡性,提高查找、插入、删除等操作的效率。
总结起来,平衡二叉树是一种特殊的二叉树,通过旋转操作来保持树的平衡性,从而提高查找、插入或删除操作的效率。
AVL树是一种常见的平衡二叉树实现方式,通过LL、RR、LR和RL旋转来使树重新平衡。
平衡二叉树的优点是能够保持树的平衡性,提高操作的效率。
数据结构实践作业
数据结构作业利用单向链表数据结构完成对链表的如下操作:1、创建一条含整数结点的无序链表2、链表结点的输出3、链表结点的升序排序4、分别计算链表中奇数和偶数结点之和并输出5、释放链表具体要求将程序功能做成菜单,形式如下:1、创建一条含整数结点的无序链表2、链表结点的输出3、链表结点的升序排序4、分别计算链表中奇数和偶数结点之和并输出5、释放链表0、退出《数据结构》大作业1 总体要求将程序功能做成菜单,形式如下:(1)创建一条含整数结点的无序链表(2)链表结点的输出(3)链表结点的升序排序(4)分别计算链表中奇数和偶数结点之和并输出(5)释放链表2 开发环境软件环境:Window10,Visual Studio 20173 系统运行效果截图(1)主菜单:(2)创建一条含整数结点的无序链表:3,6,2,5,9(3)链表结点的输出(4)链表结点的升序排序(5)分别计算链表中奇数和偶数结点之和并输出(6)释放链表4 源程序#include<iostream>//头文件using namespace std;//节点数据结构定义struct node{int data;node *next;};//创建一条含整数结点的无序链表node *CreateLinkList(){node *p1, *p2, *head;int n;p2 = NULL;head = NULL;cout <<"正在创建一个无序链表\n";cout <<"请输入一个整数,以-1结束:";cin >> n;//循环输入一个整数,直到数值为-1结束,创建一条无序链表while (n != -1){p1 = new node;p1->data = n;//采用尾插法,新建一个结点并连接到链表尾部if (head == 0){head = p1; p2 = p1; //首结点的建立}else{p2->next = p1; p2 = p1;}cout <<"请输入一个整数,以-1结束:";cin >> n;}if (head != 0) //尾结点p2->next = 0;return(head);}//输出结点void PrintLinkList(const node *head){const node *p;p = head;while (p != NULL){cout <<" "<< (p->data);p = p->next;}cout << endl;}//升序排序void SortLinkList(node *head){node temp;node *p = NULL;node *q = NULL;//判断结点为空或者只有一个结点if (head == NULL || head->next == NULL){return;}//p->next!=NULL为链表倒数第2个结点for (p = head; p->next != NULL; p = p->next) {for (q = p->next; q != NULL; q = q->next){if (p->data > q->data) //升序{ //交换数据域temp.data = q->data;q->data = p->data;p->data = temp.data;}}}return;}//奇数结点和int OddSumLinkList(const node *head){int sum = 0;const node *p;p = head;while (p){//判断数值为是否奇数if (p->data % 2 != 0){sum = sum + p->data;}p = p->next;}return sum;}//偶数结点和int EvenSumLinkList(const node *head){int sum = 0;const node *p;p = head;while (p){//判断是否偶数if (p->data % 2 == 0){sum = sum + p->data; //偶数结点的数值累加}p = p->next;}return sum;}//释放链表void DeleteLinkList(node *head){node *p;while (head){p = head;head = head->next;delete p;}printf("释放成功\n");}void main(){node *head;head = NULL;int select;cout <<"************菜单************"<< endl;cout <<"输入对应选择,执行对应操作"<< endl;cout <<"1.创建一条含整数结点的无序链表"<< endl;cout <<"2.链表结点的输出"<< endl;cout <<"3.链表节点的升序排序"<< endl;cout <<"4.分别计算链表中奇数和偶数结点之和并输出"<< endl;cout <<"5.释放链表"<< endl;cout <<"0.退出"<< endl;while (1){cout <<"\n请输入选择:";cin >> select;switch (select) //判断选项,并执行对应的函数{case 1:{head = CreateLinkList();printf("无序链表创建完成\n");break;}case 2:{printf("输出链表中各结点数据:");PrintLinkList(head);break;}case 3:{SortLinkList(head);printf("升序后:");PrintLinkList(head);break;}case 4:{int oddsum;int evensum;oddsum = OddSumLinkList(head);evensum = EvenSumLinkList(head);printf("奇数和= %d,偶数和= %d\n", oddsum, evensum);break;}case 5:{DeleteLinkList(head);break;}case 0:{cout <<"退出"<< endl;exit(0);}default:{cout <<"输入选项有误,请重新输入:"<< endl;break;}}}}。
数据结构大作业
一、大作业设计题目以下题目中任选一个1.哈夫曼编码/译码器设计要求:针对字符集A及其各字符的频率值(可统计获得),给出其中字符的哈夫曼编码,并针对一段文本(定义在A上),进行编码和译码,实现哈夫曼编码/译码系统。
2.算术表达式求值设计要求:输入任意一个算术四则表达式,可求出其值。
3.一元多项式的代数运算设计要求:计算任意两个一元多项式的加法、减法和乘法。
4.最小生成树问题设计要求:在n个城市之间架设网络,只需保证连通即可,求最经济的架设方法。
二、大作业报告要求大作业报告的开头应给出题目、班级、姓名、学号和完成日期,并包括以下7个内容:1.需求分析以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?并明确规定:(1) 输入的形式和输入值的范围;(2) 输出的形式;(3) 程序所能达到的功能;(4) 测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
2.概要设计说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
3.详细设计实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数和过程的调用关系图。
4.调试分析内容包括:a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;c.经验和体会等。
5.用户使用说明说明如何使用你编写的程序,详细列出每一步的操作步骤。
6.测试结果列出你的测试结果,包括输入和输出。
这里的测试数据应该完整和严格,最好多于需求分析中所列。
7.附录带注释的源程序。
如果提交源程序软盘,可以只列出程序文件名的清单。
数据结构(大作业)
一、应用题(每小题10分,共50分)
1.把下图中的二叉树转化成森林。
2.给定表(45,36,56,6,64,32,8,41),按数据元素在表中的次序构造一棵二叉查找树。
3.写出中缀表达式A-(B+C/D)*E的后缀形式。
ABCD/+E*-
4. 下图是一个地区的交通网络模型,顶点表示城市,边表示城市间的公路,边的权值表示构造公路的费用,请问如何构造出能连通各个城市且造价最低的交通网,并写出其构造过程。
5. 已知数据序列为12,5,9,20,6,31,24,对该数据序列进行排序,试写出冒泡排序每趟的结果。
二、算法设计题(每小题50分,共25分)
1.判断单链表head(head 指向表头)是否是递增的。
2.设一棵二叉树以二叉链表为存储结构,试写一算法求该二叉树上度为2的结点个数。
则返回递归求左子树度为2节点个数。
情况3,则返回0算法步骤,如果r 既有左孩子又有右孩子,如果r 只有左孩子,则返回1 + 递归求左子树度为2节点个数+ 递归求右子树度为2节点个数,如果r 只有右孩子。
情况4。
情况2,则返回递归求右子树度为2节点个数。
情况1:
设根节点为r,如果r 既没有左孩子又没有右孩子。
数据结构大作业题目及要求
一、Josephu 问题Josephu 问题为:设编号为1,2,…n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。
二、稀疏矩阵的操作基本功能要求:稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C,求出A的转置矩阵D,输出D。
三、背包问题的求解:假设有一个能装入总体积为T的背包和n件体积分别为w1 , w2 , …, wn 的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1 +w2 + …+ wn=T,要求找出所有满足上述条件的解。
例如:当T=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解:(1,4,3,2)(1,4,5)(8,2)(3,5,2)。
提示:可利用回溯法的设计思想来解决背包问题。
首先将物品排成一列,然后顺序选取物品装入背包,假设已选取了前i 件物品之后背包还没有装满,则继续选取第i+1件物品,若该件物品"太大"不能装入,则弃之而继续选取下一件,直至背包装满为止。
但如果在剩余的物品中找不到合适的物品以填满背包,则说明"刚刚"装入背包的那件物品"不合适",应将它取出"弃之一边",继续再从"它之后"的物品中选取,如此重复,,直至求得满足条件的解,或者无解。
由于回溯求解的规则规则是"后进先出"因此自然要用到栈。
四、n皇后问题问题描述:求出在一个n×n的棋盘上,放置n个不能互相捕捉的国际象棋"皇后"的所有布局要求:试编写程序实现将n个皇后放置在国际象棋棋盘的无冲突的位置上的算法,并给出所有的解。
家谱管理系统数据结构大作业
家谱管理系统数据结构大作业
家谱管理系统的数据结构可以采用树的数据结构来实现。
每一个人都可以看做是树的一个节点,节点之间的关系可以表示为父子关系。
具体实现时,可以定义一个Person类,其中包含以下属性:
- 姓名(name)
- 性别(gender)
- 出生日期(birth)
- 父亲(father)
- 母亲(mother)
- 子女列表(children)
然后,可以定义一个FamilyTree类,其中包含以下方法:
- 添加人员:根据提供的信息创建一个Person对象,并将其添加到家谱树中。
- 查找人员:根据姓名查找对应的Person对象。
- 添加父母关系:根据提供的信息,将两个Person对象之间建立父母关系。
- 添加子女关系:根据提供的信息,将一个Person对象添加到另一个Person对象的子女列表中。
- 删除人员:根据提供的姓名,删除对应的Person对象以及其在家谱树中的所有关系。
这样,通过FamilyTree类的方法,可以对家谱进行增加、删除、查询等操作。
家谱树的根节点可以作为整个家谱的入口。
医院选址问题(数据结构)大作业
一、实验内容概述n个村庄之间的交通图用有向加权图表示,图中的有向边<v i,v j>表示第i个村庄和第j 个村庄之间有道路,边上的权表示这条道路的长度。
现在要从这n个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院最近。
图1 医院选址加权有向图测试数据:针对图1,输入以下数据:输入顶点数:5输入顶点对和弧的权值:1 2 12 3 23 4 23 5 44 2 14 3 35 4 50 0 0二、实验目的概述“数据结构”是计算机科学与技术专业一门十分重要的专业技术基础课,计算机科学各领域及有关的应用软件都要使用到各种数据结构。
在我国,“数据结构与算法”已经作为理工科非计算机专业必修的信息技术基础课程之一。
世界上许多科技人员对学习、研究数据结构和算法都非常重视,对于从是计算机科学及其应用的科技工作者来说,数据结构与算法更是必须透彻的掌握的重要基础。
学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题,课程设计是加强学生实践能力的一个强有力的手段。
作为一名计算机专业的学生,通过对计算机课程两年的学习,掌握C++和数据结构,在完成课程设计和变成过程中,要深化对数据结构与算法课程中的基本概念、理论和方法的理解,训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念,在老师的指导下完成最少换车次数问题,把自己所学的理论用具体的问题来解决,更加直接,易懂。
提高程序设计与调试水平。
在通过学习数据结构,我们要掌握数据结构的各个算法,运用学过的算法去解决实际中的问题,将数据结构用用武之地,也能提高我们的运用能力和编写程序的能力,对我们的技能也有进一步的提高,对我们的未来之路铺路搭桥。
在这个实验中,我主要是类的成员函数去解决问题,除了学习到C语言的知识外,同样还学习到C++的知识,对我的知识也有很大扩展,将C和C++相结合,达到共同解决问题的目的。
数据结构大作业例子
数据结构大作业专业:班级:题目:最小生成树Kruskal算法学生姓名:目录1.任务与目标 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2.方案设计与论证 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (4)2.2.1 功能模块图 (4)2.2.2 流程图分析 (5)3.算法说明 (11)3.1存储结构 (11)3.2算法描述 (11)4.程序运行的测试与分析 (13)4.1调试过程 (13)1.2程序执行过程 (13)5.结论与心得 (16)6.参考文献 (16)7.附录(关键部分程序清单) (17)1.任务与目标1.1 课程设计内容编写算法能够建立带权图,并能够用Kruskal算法求该图的最小生成树。
最小生成树能够选择图上的任意一点做根结点。
最小生成树输出采用顶点集合和边的集合的形式。
1.2 课程设计要求1.顶点信息用字符串,数据可自行设定。
2.参考相应的资料,独立完成课程设计任务。
3.交规范课程设计报告和软件代码。
2.方案设计与论证2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为三大模块。
以下是三个模块的大体分析:1.要确定图的存储形式,通过对题目要求的具体分析。
发现该题的主要操作是路径的输出,因此采用边集数组(每个元素是一个结构体,包括起点、终点和权值)和邻接矩阵比较方便以后的编程。
2.Kruskal算法。
该算法设置了集合A,该集合一直是某最小生成树的子集。
在每步决定是否把边(u,v)添加到集合A中,其添加条件是A∪{(u,v)}仍然是最小生成树的子集。
我们称这样的边为A的安全边,因为可以安全地把它添加到A中而不会破坏上述条件。
3.Dijkstra算法。
算法的基本思路是:假设每个点都有一对标号(d j,p j),其中d是从起源点到点j的最短路径的长度(从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);p j则是从s到j 的最短路径中j点的前一点。
数据结构实验大作业
数据结构实验大作业大作业要求:请大家在暑假期间将数据结构实验大作业完成后,将代码粘贴在报告中,上传到网络学堂,作业在同一个班内不允许抄袭,截至日期为9月8日。
必须独立完成。
题目:一、Josephu问题Josephu问题为:设编号为1,2,…n的n个人围坐一圈,约定编号为k (1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。
示意图:源代码:#include<stdio.h>struct Josephu_node{int node_nu;struct Josephu_node * pre;struct Josephu_node * next;};struct Josephu_node * Josephu_node_add(struct Josephu_node * head,int nu){struct Josephu_node * newnode;if(head == NULL){head= (struct Josephu_node *)malloc(sizeof(struct Josephu_node)); head->node_nu= 1;head->pre= head;head->next= head;printf("Creat Head:%d",head->node_nu);}else{newnode = (struct Josephu_node *)malloc(sizeof(structJosephu_node));newnode->node_nu = nu;newnode->pre = head->pre;newnode->next= head;head->pre->next= newnode;head->pre = newnode;printf(" ,%d",head->pre->node_nu);}return head;}struct Josephu_node *Joseph_node_del(struct Josephu_node * del_node) {struct Joseph_node * del_node_next=del_node->next;if(del_node != NULL){if(del_node->next != del_node){del_node->pre->next = del_node->next;del_node->next->pre = del_node->pre;}else{del_node_next = NULL;}printf(" %d,",del_node->node_nu);free(del_node);del_node = NULL;return del_node_next;}return NULL;}int main(int argc ,char ** argv){struct Josephu_node * head=NULL;struct Josephu_node * node_tmp;int nu_people=0;int out_nu =0;int i;printf("Please input the nu of the People : ");scanf("%d",&nu_people);printf("Please input the rule out nu: ");scanf("%d",&out_nu);for(i=0;i<nu_people;i++){head = Josephu_node_add(head,i+1);}printf("\n");i = 0;node_tmp = head;printf("Out of the table: ");while(node_tmp != node_tmp->pre){if(i == out_nu-1){node_tmp = Joseph_node_del(node_tmp);i=0;continue;}i++;node_tmp = node_tmp->next;}node_tmp = Joseph_node_del(node_tmp);printf("\n");return 0;}二、稀疏矩阵的操作基本功能要求:稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C,求出A的转置矩阵D,输出D。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书设计题目:数据结构课程设计专业:软件工程班级:二班设计人:焦玉玮山东科技大学2013年 1 月 6 日山东科技大学课程设计任务书软件工程专业二班201101051711一、课程设计题目:数据结构课程设计二、设计原始资料:《数据结构题集》三、设计应解决下列各主要问题:1、约瑟夫环2、马踏棋盘_______3、稀疏矩阵运算器4、哈夫曼编译器______5、哈希表设计四、设计说明书应附有下列图纸:五、命题发出日期:设计应完成日期:设计指导教师(签章):系主任(签章):指导教师对课程的评语指导教师(签章):年月日第一题:约瑟夫环问题描述:编号为1,2,……,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
一、需求分析1.本演示程序中,人数n应为任意的,首先应输入一个值赋给初始报数上限m,程序应能自动保存出列人的序号和将出列的人所持的密码赋给m,再次作为报数上限,如此循环,直至所有人都出列为止。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入相应数据(即每个人所持的密码),每个人的序号由程序自动分配。
3.程序执行的命令包括:(1)构造链表;(2)输入数据;(3)执行报数,储存出列人的序号,删除出列人的信息以及把出列人的密码赋给m;(4)结束。
4.测试数据(1)n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m 值为6,则这正确的出列顺序为6,1,4,7,2,3,5。
二、概要设计使用单向循环链表为存储结构来实现上述操作。
链表的抽象数据类型定义为:ADT List{数据对象:D={ai 丨ai∈Elemset,i=1,2,……,n,n≥0}数据关系:R1={<ai-1 ,ai>丨ai-1,ai∈D,i=1,2,……,n}基本操作:InitList(&L)操作结果:构造一个空的线性表L。
DestoryList(&L)初始条件:线性表L已存在。
操作结果:销毁线性表L。
ClearList(&L)初始条件:线性表L已存在。
操作结果:将L重置为空表。
ListEmpty(L)初始条件:线性表L已存在。
操作结果:若L为空表,则返回TRUE,否则返回FALSE。
ListLength(L)初始条件:线性表L已存在。
操作结果:返回L中数据元素个数。
GetElem(L,I,&e)初始条件:线性表L已存在,1≤i≤ListLength(L)。
操作结果:用e返回L中第i个数据元素的值。
LocateElem(L,e,compare())初始条件:线性表L已存在,compare()时数据元素判定函数。
操作结果:返回L中第一个与e满足关系compare()的数据元素的位序若这样的数据元素不存在,则返回值0。
PriorElem(L,cur_e,&pre_e)初始条件:线性表L已存在。
操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。
NextElem(L,cur_e,&next_e)初始条件:线性表L已存在。
操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义。
ListInsert(&L,I,e)初始条件:线性表L已存在,1≤i≤ListLength(L)+1.操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1.ListDelete(&L,I,&e)初始条件:线性表L已存在切非空,1≤i≤ListLength(L).操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1.ListTraverse(L,visit())初始条件:线性表L已存在。
操作结果:依次对L的每个数据元素调用函数visit()。
一旦visit()失败,则操作失败。
} ADT List本程序包含三个模块:(1)主程序模块;(2)构造链表并输入每个人信息模块(3)释放节点模块三、详细设计元素类型,结点类型和指针类型:typedef int ElemType;typedef struct LNode{int num;ElemType data;struct LNode *next;}LNode;LNode *head; *this; *new;每个模块的分析:主程序模块:main(){int m,n,i;printf("Enter the first code (m):");scanf("%d",&m);printf("\nEnter the people number (n):"); scanf("%d",&n);getchar();printf("\n");new_code(n);if(head!=NULL)delete_code(n,m);else{printf("list is empty\n");exit();}for(i=0;i<n;i++)printf("%-3d",str[i]);printf("\n");}构造链表并输入每个人信息模块;new_code(int a){int i=1;char numstr[10];new=(LNode *)malloc(sizeof(LNode)); if(new==NULL)return ERROR;if(head==NULL)head=new;this=head;while(--a!=0){this->num=i;printf("enter the %d code(data):",i);gets(numstr);this->data=atoi(numstr);new=(LNode *)malloc(sizeof(LNode));this->next=new;this=new;i++;}this->num=i;printf("enter the %d code(data):",i); gets(numstr);this->data=atoi(numstr);this->next=head;return OK;}释放结点模块delete_code(int a,int b){int i;int j=0;LNode *p;while((a--)!=1){for(i=1;i<=b;i++){p=this;this=this->next;}b=this->data;str[j]=this->num;p->next=this->next;free(this);j++;}str[j]=this->next->num;return OK;}主程序模块:#include<stdio.h>#include<stdlib.h>typedef struct node{int number;int psw;struct node *next;}Lnode ,*Linklist;void insert( Linklist * list , Linklist q , int e1 ,int e2 ){Linklist p;p=( Linklist )malloc( sizeof( Lnode ) ); //给链表分配预存空间p->number=e1;p->psw=e2;if(!*list){*list=p; //如果链表为空,则就将p作为头结点;p->next=NULL;}else{p->next=q->next; //插入节点qq->next=p;}}void creat( Linklist *jsp ,int n ){Linklist q=NULL ;Linklist list=NULL;int i,e;printf( "\n请输入每个人手中的密码:\n " );for( i=0 ; i<n ;i++ ){scanf("%d",&e);insert( &list ,q ,i+1 ,e );if( i==0 ) //第一次生成头结点,指向pq=list;elseq=q->next; //q指向下一个节点}q->next=list; //形成一个循环链表*jsp = list;}void shuchu( Linklist *jsp , int m ){Linklist q,p;int i;p=q=*jsp;while( q->next !=p )q=q->next; //q 指向p 的前一个节点printf( "\n出列的人的顺序编号:\n" );while( p->next !=p ) // 判断循环结束的标志{for( i=0;i<m-1;i++ ){ //P 指向要删除的节点,q指向p 的前一个节点q=p;p=p->next;}q->next = p->next; //删除p 指向的节点printf("%d ",p->number);m=p->psw; //重新定义一个报数上限free(p); //释放节点pp=q->next; //指向下一个节点}printf( "\n\n最后有一个的序号为%d \n",p->number ); //读出最后一个数据}int main(){Linklist jsp;int n ,m;printf( "请输入约瑟夫环问题的人数:\n" );scanf("%d",&n); //输入约瑟夫环问题的总人数creat(&jsp , n);printf("\n请输入初始最大的出列序号\n");scanf("%d",&m);shuchu( &jsp , m );system("pause");return 0;}四调试分析1.由于对引用调用理解的不透侧,导致刚开始修改了很长时间。