东北大学数据结构实验一
《数据结构》实验1实验报告
南京工程学院实验报告<班级>_<学号>_<实验X>.RAR文件形式交付指导老师。
一、实验目的1.熟悉上机环境,进一步掌握语言的结构特点。
2.掌握线性表的顺序存储结构的定义及实现。
3.掌握线性表的链式存储结构——单链表的定义及实现。
4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。
5.掌握线性表在链式存储结构——单链表中的各种基本操作。
二、实验内容1.顺序线性表的建立、插入及删除。
2.链式线性表的建立、插入及删除。
三、实验步骤1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。
2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。
3.建立一个带头结点的单链表,结点的值域为整型数据。
要求将用户输入的数据按尾插入法来建立相应单链表。
四、程序主要语句及作用程序1的主要代码(附简要注释)public struct sequenlist{public const int MAXSIZE=1024; /*最大值为1024*/public elemtype[] vec;public int len; /* 顺序表的长度 */public sequenlist( int n){vec=new elemtype[MAXSIZE ];len = n;}};class Program{static void Main(string[] args){sequenlist list1 = new sequenlist(5);for (int i = 0; i < 5; i++){list1.vec[i] = i;}for (int i = 0; i < 5; i++){Console.Write("{0}---", list1.vec[i]) ;}Console.WriteLine("\n");Console.WriteLine("表长:{0}\n",list1.len );Console.ReadKey();}}程序2的主要代码(附简要注释)public void insertlist(int i, int x){if (len >= MAXSIZE)throw new Exception("上溢"); /*长度大于最大值则抛出异常*/if (i < 1 || i > len + 1)throw new Exception("位置");/插入位置小于1或大于len+1则抛出插入位置错误的异常for (int j = len; j >= i; j--)vec[j] = vec[j - 1]; //注意第j个元素存在数组下标为j-1处vec[i - 1] = x;len++;}};class Program{static void Main(string[] args){sequenlist list2 = new sequenlist(7);list2.vec[0] = 21;list2.vec[1] = 23;list2.vec[2] = 14;list2.vec[3] = 5;list2.vec[4] = 56;list2.vec[5] = 17;list2.vec[6] = 31;Console.Write("请输入第i个位置插入元素:");int loc =Convert.ToInt32( Console.ReadLine());Console.Write("请输入第{0}个位置插入的元素:", loc);int ele = Convert.ToInt32(Console.ReadLine());Console.WriteLine("插入前的线性表:");for (int i = 0; i < list2.len ; i++){Console.Write("{0}---", list2.vec[i]);}Console.WriteLine("\n");list2.insertlist(loc, ele);Console.WriteLine("插入后的线性表:");for (int i = 0; i < list2.len ; i++){Console.Write("{0}---", list2.vec[i]);}Console.WriteLine("\n");Console.ReadKey();}}程序3的主要代码(附简要注释)class Node{private int num;public int Num{set { num = value; }/输入值get { return num; }/获得值}private Node next;public Node Next{set { next = value; }get { return next; }}}class Pp{static void Main(string[] args){Node head;Node tempNode, tempNode1;int i;head = new Node();Console.WriteLine("输入六项数据:\n");Console.Write("输入第1项数据:");head.Num = Convert.ToInt32(Console.ReadLine());head.Next = null;tempNode = head;for (i = 1; i < 6; i++){tempNode1 = new Node();Console.Write("输入第{0}项数据:",i+1);tempNode1.Num = Convert.ToInt32(Console.ReadLine());/插入项转换为整形数值 tempNode1.Next = null;tempNode.Next = tempNode1;tempNode = tempNode.Next;}Console.WriteLine("线性表:");tempNode = head;for (i = 0; i < 6; i++){Console.Write("{0}", tempNode.Num);if (i < 5){Console.Write("--");}tempNode = tempNode.Next;}Console.ReadKey();}}五、程序运行结果截图程序1程序2程序3六、收获,体会及问题(写得越详细、越个性化、越真实越好,否则我不知道你做这个实验的心路历程,也就无法充分地判断你是否是独立完成的这个实验、你是否在做这个实验时进行了认真仔细地思考、通过这个实验你是否在实践能力上得到了提高)这次试验刚开始做时完全不知道从哪下手,才刚上了几节课,对于线性表、链式表都不是理解的很透彻,不知道用哪个软件编写程序。
数据结构实验一 实验报告
班级:姓名:学号:实验一线性表的基本操作一、实验目的1、掌握线性表的定义;2、掌握线性表的基本操作;如建立、查找、插入和删除等..二、实验内容定义一个包含学生信息学号;姓名;成绩的顺序表和链表二选一;使其具有如下功能:1 根据指定学生个数;逐个输入学生信息;2 逐个显示学生表中所有学生的相关信息;3 根据姓名进行查找;返回此学生的学号和成绩;4 根据指定的位置可返回相应的学生信息学号;姓名;成绩;5 给定一个学生信息;插入到表中指定的位置;6 删除指定位置的学生记录;7 统计表中学生个数..三、实验环境Visual C++四、程序分析与实验结果#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status; // 定义函数返回值类型typedef struct{char num10; // 学号char name20; // 姓名double grade; // 成绩}student;typedef student ElemType;typedef struct LNode{ElemType data; // 数据域struct LNode *next; //指针域}LNode;*LinkList;Status InitListLinkList &L // 构造空链表L {L=struct LNode*mallocsizeofstruct LNode; L->next=NULL;return OK;}Status GetElemLinkList L;int i;ElemType &e // 访问链表;找到i位置的数据域;返回给 e{LinkList p;p=L->next;int j=1;whilep&&j<i{p=p->next;++j;}ifp||j>i return ERROR;e=p->data;return OK;}Status SearchLNode L;char str;LinkList &p // 根据名字查找{p=L.next;whilep{ifstrcmpp->;str==0return OK;p=p->next;}return ERROR;}Status ListInsertLinkList L;int i;ElemType e // 在i个位置插入某个学生的信息{LinkList p;s;p=L;int j=0;whilep&&j<i-1{p=p->next;++j;}ifp||j>i-1 return ERROR;s=struct LNode*mallocsizeofLNode;s->data=e;s->next=p->next;p->next=s;return OK;}Status ListDeleteLinkList p;int i // 删除i位置的学生信息{int j=0;whilep->next&&j<i-1{p=p->next;++j;}ifp->next||j>i-1 return ERROR;LinkList q;q=p->next;p->next=q->next;delete q;return OK;}void InputElemType *e{printf"姓名:"; scanf"%s";e->name;printf"学号:"; scanf"%s";e->num;printf"成绩:"; scanf"%lf";&e->grade;printf"输入完成\n\n";}void OutputElemType *e{printf"姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n";e->name;e->num;e->grade;}int main{LNode L;LinkList p;ElemType a;b;c;d;printf"\n********************************\n\n";puts"1. 构造链表";puts"2. 录入学生信息";puts"3. 显示学生信息";puts"4. 输入姓名;查找该学生";puts"5. 显示某位置该学生信息";puts"6. 在指定位置插入学生信息";puts"7. 在指定位置删除学生信息";puts"8. 统计学生个数";puts"0. 退出";printf"\n********************************\n\n"; int x;choose=-1;whilechoose=0{puts"请选择:";scanf"%d";&choose;switchchoose{case 1:ifInitListpprintf"成功建立链表\n\n";elseprintf"链表建立失败\n\n";break;case 2:printf"请输入要录入学生信息的人数:";scanf"%d";&x;forint i=1;i<=x;i++{printf"第%d个学生:\n";i;Input&a;ListInsert&L;i;a;}break;case 3:forint i=1;i<=x;i++{GetElem&L;i;b;Output&b;}break;case 4:char s20;printf"请输入要查找的学生姓名:";scanf"%s";s;ifSearchL;s;pOutput&p->data;elseputs"对不起;查无此人";puts"";break;case 5:printf"请输入要查询的位置:";int id1;scanf"%d";&id1;GetElem&L;id1;c;Output&c;break;case 6:printf "请输入要插入的位置:";int id2;scanf"%d";&id2;printf"请输入学生信息:\n";Input&d;ifListInsert&L;id2;d{x++;puts"插入成功";puts"";}else{puts"插入失败";puts"";}break;case 7:printf"请输入要删除的位置:";int id3;scanf"%d";&id3;ifListDelete&L;id3{x--;puts"删除成功";puts"";}else{puts"删除失败";puts"";}break;case 8:printf"已录入的学生个数为:%d\n\n";x;break;}}printf"\n\n谢谢您的使用;请按任意键退出\n\n\n"; system"pause";return 0;}用户界面:(1)根据指定学生个数;逐个输入学生信息:(2)逐个显示学生表中所有学生的相关信息:(3)根据姓名进行查找;返回此学生的学号和成绩:(4)根据指定的位置可返回相应的学生信息学号;姓名;成绩:(5)给定一个学生信息;插入到表中指定的位置:(6)删除指定位置的学生记录:(7)统计表中学生个数:五、实验总结数据结构是一门专业技术基础课..它要求学会分析研究计算机加工的数据结构的特性;以便为应用涉及的数据选择适当的逻辑结构;存储结构及相应的算法;并初步掌握算法的时间分析和空间分析技术..不仅要考虑具体实现哪些功能;同时还要考虑如何布局;这次的实验题目是根据我们的课本学习进程出的;说实话;我并没有真正的读懂书本的知识;所以刚开始的时候;感到很棘手;于是又重新细读课本;这一方面又加强了对书本的理解;在这上面花费了一些心血;觉得它并不简单;是需要花大量时间来编写的....在本次实验中;在程序构思及设计方面有了较大的锻炼;能力得到了一定的提高..。
东北大学数据结构实验报告
.. ... ... 实 验 报 告一、实验目的(1) 掌握线性表的基本操作(插入、删除、查找)以及线性表合并等运算在顺序存储结构、链式存储结构上的实现。
重点掌握链式存储结构实现的各种操作。
(2) 掌握线性表的链式存储结构的应用。
二、实验内容与实验步骤(1)实验内容:实现约瑟夫环,约瑟夫环(Joseph )问题的一种描述是:编号为1、2、3……n 的n 个人按照顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m ,从第一个人开始按照顺时针的方向自1开始顺序报数,报到m 时停止报数。
报m 的人出列,将他的密码作为新的m 值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
设计一个程序求出出列顺序。
(2)抽象数据类型和设计的函数描述,说明解决设想。
首先定义一个链表,用其中的data 项存储每个人的编号,用password 项存储每个人所持有的密码,并且声明一个指针。
之后使用CreatList_CL 函数来创建一个循环链表,在其中的data 和password 中存入编号和密码,最后使最后一个节点的next 指向L ,使其能够形成循环队列。
定义了函数Display 来显示链表当中的内容,以确定存储的数据没有错误。
定义了函数Delete_L 来实现约瑟夫环中依次删除的功能,依次比较,如果某个人所持的密码和m 值相等,则删除这个结点,并且输出此时该结点的编号和密码,实现出列的功能。
(3) 简短明确地写出实验所采用的存储结构,并加以说明。
该实验我主要采用的是线性表的链式存储结构,首先定义了链表的结构,其中包括data 项和password 项,分别存储每个人的编号和所持密码,还声明了指向下一个结点的指针,该指针可以连接各个结点,并且将最后一个结点的指针指向第一个结点使之成为一个循环链表。
三、实验环境操作系统:Windows 7调试软件名称:Visio Studio2017 上机地点:信息楼B405 四、实验过程与分析(1)主要的函数或操作内部的主要算法,分析这个算法的时、空复杂度,并说明设计的巧妙之处。
东北大学数据结构运动会竞赛成绩统计实验报告
《数据结构》实验报告实验内容:运动会竞赛成绩统计数据结构实验报告一.课题概述 (1)二.概要设计原理 (1)三.详细程序清单及注释说明 (2)四.运行与测试及结果 (7)五.本人编写函数 (11)六.心得体会 (13)七.参考文献 (13)一、课题概述1.实验目的:线性表应用类实验题目参考2.实验内容:运动会竞赛成绩统计【问题描述】东北大学第51届运动大会成功举行。
共有N个学院的男女代表队参赛。
大会共设M个男子项目和W个女子项目。
大会即将闭幕,准备公布成绩。
【实验要求】设计运动会竞赛成绩统计程序。
(1)采用顺序表或链表等数据结构。
(2)统计各代表队的男女总分和团体总分。
(3)公布各单项成绩的前六名和团体成绩的前三名。
(4)可以查询成绩。
二、概要设计原理本程序主要采用了链表的存储结构,实现了对数据的存储,访问等操作。
本程序实现了男子团体成绩、女子团体成绩、总成绩的输出。
以及对个单项和团体成绩的前六名的输出。
并实现了查找功能。
程序主要分为四个函数:1.Zongfen()这个函数主要实现计算各学院的男子总分、女子总分、以及团体总分的计算以及存储操作。
2.tuandui_paiming()此函数运用了排顺函数,实现了对团体总分的排序,以及前六名的输出。
3.danxiang_paiming()此函数运用了排序函数,实现了对单项成绩的排名,以及对各个单项前六名的输出。
4.chazhao()通过此函数,可以实现对各个学院的查找,并且显示出各个学院的单项成绩,以及男子团体成绩、女子团体成绩、总成绩的输出。
5.main()6.主函数,实现对所有函数的协调,并且执行了一些程序中相当关键的部分,对整个程序的执行以及正确的输出起到了很大的作用。
7.zhujiemain()主界面函数,实现函数运行时界面的输出,以及对接下来操作的选择,是整个程序的关键部分。
三、详细程序清单及注释说明#include<>#include<>#include<>typedef struct xueyuan{char name[10]; 成绩及团体排名 ----\n""---- 2.单项排名----\n""---- 3.查找----\n""---- 其他.退出----\n""----------------------------------------------------\n");int choose;printf("请输入您的选择:");scanf("%d",&choose);switch(choose){case 1:zongfen();tuandui_paiming();break;case 2:danxiang_paiming();break;case 3:chazhao();break;default:exit(0);}}void main() 界面2.各学院总分3.团体总分4.单项排名5.查找—信息---机械6.退出五.本人编写函数#include<>#include<>#include<>typedef struct xueyuan{char name[10]; 成绩及团体排名 ----\n""---- 2.单项排名----\n""---- 3.查找----\n""---- 其他.退出----\n""----------------------------------------------------\n");int choose;printf("请输入您的选择:");scanf("%d",&choose);switch(choose){case 1:zongfen();tuandui_paiming();break;case 2:danxiang_paiming();break;case 3:chazhao();break;default:exit(0);}}void main() //主函数{shuju();zhujiemian();}六.心得体会通过这次的程序设计,使自己对链表的操作有了更进一步的了解。
东北大学《数据结构Ⅰ》在线平时作业-03
《数据结构Ⅰ》在线平时作业3
已知含10个结点的二叉排序树是一棵完全二叉树,则该二叉排序树在等概率情况下查找成功的平均查找长度等于
A:1.0
B:2.9
C:3.4
D:5.5
参考选项:B
在线性表的下列运算中,不改变数据元素之间结构关系的运算是
A: 插入
B:删除
C:排序
D:查找
参考选项:D
假设在构建散列表时,采用线性探测解决冲突。
若连续插入的n个关键字都是同义词,则查找其中最后插入的关键字时,所需进行的比较次数为
A:n-1
B:n
C:n+1
D:n+2
参考选项:B
n个顶点的有向完全图中含有向边的数目最多为
A:n-1
B: n
C:n(n-1)/2
D:n(n-1)
参考选项:D
下列查找算法中,平均查找长度与元素个数n不直接相关的查找方法是
A: 分块查找
B: 顺序查找
C: 二分查找
D:散列查找
参考选项:D
下列关键字序列中,构成小根堆的是
A:{84,46,62,41,28,58,15,37}
B:{84,62,58,46,41,37,28,15}
C:{15,28,46,37,84,41,58,62}
1。
数据结构第一次实验报告
数据结构第一次实验报告实验报告:数据结构第一次实验摘要:本次实验旨在通过实践操作,加深对数据结构的理解,并掌握数据结构的基本操作。
实验中,我们使用C++编程语言实现了链表、栈和队列的相关操作,并对其进行了测试和分析。
实验结果表明,我们成功地完成为了链表、栈和队列的实现,并验证了它们的正确性和效率。
1. 引言数据结构是计算机科学中的重要基础课程,它研究数据的组织方式和存储结构,以及对数据进行操作和处理的方法。
本次实验旨在通过实践操作,加深对数据结构的理解,并掌握数据结构的基本操作。
2. 实验目的- 熟悉链表、栈和队列的基本概念;- 掌握链表、栈和队列的基本操作;- 分析链表、栈和队列的时间复杂度。
3. 实验方法3.1 链表的实现我们使用C++编程语言实现了链表的基本操作,包括创建链表、插入节点、删除节点和打印链表等。
具体实现过程如下:- 定义一个链表节点结构体,并在结构体中定义节点的数据域和指针域;- 创建链表,即定义一个头节点,并设置头节点的指针域为空;- 插入节点,即在链表中指定位置插入一个新节点;- 删除节点,即删除链表中指定位置的节点;- 打印链表,即遍历链表并输出节点的数据。
3.2 栈的实现我们使用C++编程语言实现了栈的基本操作,包括入栈、出栈和判断栈是否为空等。
具体实现过程如下:- 定义一个栈结构体,并在结构体中定义一个数组和一个指针top,用于存储栈元素和指示栈顶位置;- 入栈,即将一个元素压入栈中,同时将指针top向上挪移一个位置;- 出栈,即将栈顶元素弹出栈,同时将指针top向下挪移一个位置;- 判断栈是否为空,即判断指针top是否指向栈底。
3.3 队列的实现我们使用C++编程语言实现了队列的基本操作,包括入队、出队和判断队列是否为空等。
具体实现过程如下:- 定义一个队列结构体,并在结构体中定义一个数组、一个指针front和一个指针rear,用于存储队列元素和指示队首和队尾位置;- 入队,即将一个元素插入队列尾部,同时将指针rear向后挪移一个位置;- 出队,即将队首元素删除,同时将指针front向后挪移一个位置;- 判断队列是否为空,即判断指针front和指针rear是否相等。
东北大学19春学期《数据结构Ⅰ》在线作业123答案
19春学期《数据结构Ⅰ》在线作业1一棵完全二叉树上有1001个结点,其中叶子结点的个数是A.250B.500C.254D.以上答案都不对正确答案:D顺序存储设计时,存储单元的地址A.一定连续B.一定不连续C.不一定连续D.部分连续,部分不连续正确答案:A若有序表的关键字序列为(b,c,d,e,f,g,q,r,s,t),则在二分查找关键字b的过程中,先后进行比较的关键字依次为A.f,c,bB.f,d,bC.g,c,bD.g,d,b正确答案:A在对n个关键字进行直接选择排序的过程中,每一趟都要从无序区选出最小关键字元素,则在进行第i趟排序之前,无序区中关键字元素的个数为A.iB.i+1C.n-iD.n-i+1正确答案:C在长度为n的顺序表中删除第i个元素(1in)时,元素移动的次数为A.n-i+1B.iC.i+1D.n-i正确答案:D在线性表的下列运算中,不改变数据元素之间结构关系的运算是A.插入B.删除C.排序D.查找正确答案:D队列和栈的主要区别是A.逻辑结构不同B.存储结构不同C.所包含的运算个数不同D.限定插入和删除的位置不同正确答案:D数组A[1..5,1..6]的每个元素占5个单元,将其按行优先次序存储在起始地址为1000的连续的内存单元中,则元素A[5,5]的地址为A.1140B.1145C.1120D.1125正确答案:A通常将链串的结点大小设置为大于1是为了A.提高串匹配效率B.提高存储密度C.便于插入操作D.便于删除操作正确答案:B高度为5的完全二叉树中含有的结点数至少为A.16B.17。
东北大学2017年秋学期《数据结构Ⅰ》在线作业
东北大学17秋学期《数据结构Ⅰ》在线作业2一、单选题(共 20 道试题,共 100 分。
)1. 假设以数组A[m]存放循环队列的元素。
已知队列的长度为length,指针rear指向队尾元素的下一个存储位置,则队头元素所在的存储位置为A. (rear-length+m+1)%mB. (rear-length+m)%mC. (rear-length+m-1)%mD. (rear-length)%m正确答案:B2. 队列和栈的主要区别是A. 逻辑结构不同B. 存储结构不同C. 所包含的运算个数不同D. 限定插入和删除的位置不同正确答案:D3. 在单链表中,指针p指向元素为x的结点,实现“删除x的后继”的语句是A. p=p->next;B. p->next=p->next->next;C. p->next=p;D. p=p->next->next;正确答案:B4. 已知在一棵度为3的树中,度为2的结点数为4,度为3的结点数为3,则该树中的叶子结点数为A. 5B. 8C. 11D. 18正确答案:C5. 顺序存储设计时,存储单元的地址A. 一定连续B. 一定不连续C. 不一定连续D. 部分连续,部分不连续正确答案:A6. 从逻辑上可以把数据结构分为两大类,即A. 动态结构、静态结构B. 顺序结构、链式结构C. 线性结构、非线性结构D. 初等结构、构造型结构正确答案:C7. 索引非顺序文件的特点是A. 主文件无序,索引表有序B. 主文件有序,索引表无序C. 主文件有序,索引表有序D. 主文件无序,索引表无序正确答案:A8. 算法分析的目的是A. 辨别数据结构的合理性B. 评价算法的效率C. 研究算法中输入与输出的关系D. 鉴别算法的可读性正确答案:B9. 以下数据结构中,属于线性结构的是A. 广义表B. 二叉树C. 稀疏矩阵D. 串正确答案:A10. 如果求一个连通图中以某个顶点为根的高度最小的生成树,应采用A. 深度优先搜索算法B. 广度优先搜索算法C. 求最小生成树的prim算法D. 拓扑排序算法正确答案:B11. 带行表的三元组表是稀疏矩阵的一种A. 顺序存储结构B. 链式存储结构C. 索引存储结构D. 散列存储结构正确答案:A12. 多维数组之所以有行优先顺序和列优先顺序两种存储方式是因为A. 数组的元素处在行和列两个关系中B. 数组的元素必须从左到右顺序排列C. 数组的元素之间存在次序关系D. 数组是多维结构,内存是一维结构正确答案:D13. 在下列对顺序表进行的操作中,算法时间复杂度为O(1)的是A. 访问第i个元素的前驱B. 在第i个元素之后插入一个新元素C. 删除第i个元素D. 对顺序表中元素进行排序正确答案:A14. 在用邻接表表示图时,拓扑排序算法时间复杂度为A. O(n)B. O(n+e)C. O(n*n)D. O(n*n*n)正确答案:B15. 在长度为n的顺序表的第i(1≤i≤n+1)个位置上插入一个元素,元素的移动次数为A. n-i+1B. n-iC. iD. i-1正确答案:A16. 当在二叉排序树中插入一个新结点时,若树中不存在与待插入结点的关键字相同的结点,且新结点的关键字小于根结点的关键字,则新结点将成为A. 左子树的叶子结点B. 左子树的分支结点C. 右子树的叶子结点D. 右子树的分支结点正确答案:A17. 已知一组关键字为{25,48,36,72,79,82,23,40,16,35},其中每相邻两个为有序子序列。
东北大学16春学期《数据结构Ⅰ》在线作业参考答案
东北大学16春学期《数据结构Ⅰ》在线作业参考答案一、单选题:1. 若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为 (满分:5)A. 1和5B. 2和4C. 4和2D. 5和12. 为便于判别有向图中是否存在回路,可借助于 (满分:5)A. 广度优先搜索算法B. 最小生成树算法C. 最短路径算法D. 拓扑排序算法3. 连通网的最小生成树是其所有生成树中 (满分:5)A. 顶点集最小的生成树B. 边集最小的生成树C. 顶点权值之和最小的生成树D. 边的权值之和最小的生成树4. 上溢现象通常出现在 (满分:5)A. 顺序栈的入栈操作过程中B. 顺序栈的出栈操作过程中C. 链栈的入栈操作过程中D. 链栈的出栈操作过程中5. ALV树是一种平衡的二叉排序树,树中任一结点的 (满分:5)A. 左、右子树的高度均相同B. 左、右子树高度差的绝对值不超过1C. 左子树的高度均大于右子树的高度D. 左子树的高度均小于右子树的高度6. ISAM文件的周期性整理是为了空出 (满分:5)A. 磁道索引B. 柱面索引C. 柱面基本区D. 柱面溢出区7. 已知函数Sub(s,i,j)的功能是返回串s中从第i个字符起长度为j的子串,函数Scopy(s,t)的功能为复制串t 到s。
若字符串S=″SCIENCESTUDY″,则调用函数Scopy(P,Sub(S,1,7))后得到 (满分:5)A. P=″SCIENCE″B. P=″STUDY″C. S=″SCIENCE″D. S=″STUDY″8. 链栈与顺序栈相比,比较明显的优点是 (满分:5)A. 插入操作更加方便B. 删除操作更加方便C. 不会出现下溢的情况D. 不会出现上溢的情况9. 当在二叉排序树中插入一个新结点时,若树中不存在与待插入结点的关键字相同的结点,且新结点的关键字小于根结点的关键字,则新结点将成为 (满分:5)A. A.左子树的叶子结点B. B.左子树的分支结点C. C.右子树的叶子结点D. D.右子树的分支结点10. 高度为5的完全二叉树中含有的结点数至少为 (满分:5)A. 16B. 17C. 31D. 3211. 已知一棵含50个结点的二叉树中只有一个叶子结点,则该树中度为1的结点个数为 (满分:5)A. 0B. 1C. 48D. 4912. 快速排序在最坏情况下的时间复杂度是 (满分:5)A. O(n2log2n)B. O(n2)C. O(nlog2n)D. O(log2n)13. for(i=0;i;i++)for(j=0;j;j++)c[i][j]=0;for(i=0;i;i++)for(j=0;j;j++)for(k=0;k;k++)c[i][j]=c[i][j]+a[i][k]*b[k][j];上列程序的时间复杂度为 (满分:5)A. O(m+n×t)B. O(m+n+t)C. O(m×n×t)D. O(m×t+n)14. 根据数据元素的关键字直接计算出该元素存储地址的存储方法是 (满分:5)A. 顺序存储方法B. 链式存储方法C. 索引存储方法D. 散列存储方法15. 在计算机内实现递归算法时所需的辅助数据结构是 (满分:5)A. 栈B. 队列C. 树D. 图16. 除第一层外,满二叉树中每一层结点个数是上一层结点个数的 (满分:5)A. 1/2倍B. 1倍D. 3倍17. 一棵完全二叉树上有1001个结点,其中叶子结点的个数是 (满分:5)A. 250B. 500C. 254D. 以上答案都不对18. 若一个有向图的邻接距阵中,主对角线以下的元素均为零,则该图的拓扑有序序列 (满分:5)A. 一定存在B. 一定不存在C. 不一定存在D. 不确定19. 以下说法不正确的是 (满分:5)A. 无向图中的极大连通子图称为连通分量B. 连通图的广度优先搜索中一般要采用队列来暂存刚访问过的顶点C. 图的深度优先搜索中一般要采用栈来暂存刚访问过的顶点D. 有向图的遍历不可采用广度优先搜索20. 数据元素及其关系在计算机存储器内的表示,称为数据的 (满分:5)A. 逻辑结构B. 存储结构C. 线性结构D. 非线性结构16春学期《数据结构Ⅰ》在线作业2一、单选题:1. 设哈希表长为14,哈希函数H(key)=key%11,表中已有数据的关键字为15,38,61,84,四个,现将关键字为49的结点加到表中,用二次探测再散列法解决冲突,则放入的位置是 (满分:5)A. 8B. 3C. 5D. 92. for(i=0;i;i++)for(j=0;j;j++)c[i][j]=0;for(i=0;i;i++)for(j=0;j;j++)for(k=0;k;k++)c[i][j]=c[i][j]+a[i][k]*b[k][j];上列程序的时间复杂度为 (满分:5)A. O(m+n×t)B. O(m+n+t)C. O(m×n×t)D. O(m×t+n)3. 为使平均查找长度达到最小,当由关键字集合{05,11,21,25,37,40,41,62,84}构建二叉排序树时,第一个插入的关键字应为 (满分:5)A. 05B. 37D. 624. 已知函数Sub(s,i,j)的功能是返回串s中从第i个字符起长度为j的子串,函数Scopy(s,t)的功能为复制串t 到s。
数据结构实验一(完整版)
数据结构实验一:线性表实验报告#include <string.h>#include <ctype.h>#include <malloc.h> // malloc()等#include <limits.h> // INT_MAX等#include <stdio.h> // EOF(=^Z或F6),NULL#include <stdlib.h> // atoi()#include <io.h> // eof()#include <math.h> // floor(),ceil(),abs()#include <process.h> // exi t()#include <iostream.h> // cout,cin// 函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSEtypedef int ElemType;#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量#define LISTINCREMENT 2 // 线性表存储空间的分配增量struct SqListElemType *elem; // 存储空间基址int length; // 当前长度int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)};/**********************************************************/ /* 顺序表示的线性表的基本操作(12个) *//**********************************************************/ Status InitList(SqList &L){ // 操作结果:构造一个空的顺序线性表---------------1L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem)exit(OVERFLOW); // 存储分配失败L.length=0; // 空表长度为0L.listsize=LIST_INIT_SIZE; // 初始存储容量return OK;}Status DestroyList(SqList &L){ // 初始条件:顺序线性表L已存在。
东北大学 数据结构 模拟队列打印 实验报告
上。 时间复杂度:O(n) 空间复杂度:O(n) 巧妙之处:说实话,不巧妙,算法性能还可以略微提高。 (2) 你在调试过程中发现了怎样的问题?又做了怎样的改进 (要求写出具体的事例) 有些event的wait_until是同时的,所以每次入队后直接把time+1是不对 的,可能漏掉一个event。改进,每次弹出一个event后不要立即改变 time值,当下一循环time不再等于顶端元素的wait_until时再加1. (3) 你的实现是否具有可扩展性,如针对多个打印队列的仿 真程序? 稍微改一下是可以的。 五、实验结果总结 回答以下问题: (1) 你的测试充分吗?为什么?你是怎样考虑的? 用了试验给出的ARBITRARY和BIGFIRST两组数据,结果均正确。 (2) 为什么你要选用队列作为你应用的数据结构? 其先进先出的特性符合打印业务的要求。 (3) 用一段简短的代码及说明论述你的应用中主要的函数的 主要处理部分。
实 验 报 告
课程名称:数据结构 班级:会计 1203 实验名称:打印机模拟
程序的设计
实验成绩: 批阅教师签字: 实验日期:2014年 22日 实验时间: 时 时 分 06月
学号: 20120577 姓名:柳思 杨 组号:
实验编号:实验一 指导教师:张明卫
分-
一、实验目的 写出你认为比较重要的实验目的 1、了解和掌握队列的数据类型描述及其特点。 2、掌握队列初始化、入队、出队等相关基本操作的实现方法,从 而达到能灵活运用队列解决应用问题的目的。 二、实验内容与实验步骤 (1) 简短明确地写出实验的内容 1.首先,在一个名为fifo.h的文件声明类fifo。声明类fifo适当模型下 面的关系:一个fifo是一种模拟器。 2.接下来,完整的实现fifo::模拟。这个成员函数应该首先使用继承 loadworkload加载数据文件,那么它应该实现仿真如上所述。使用继 承seconds_per_page数据成员,以帮助确定打印作业需要打印多 久。你的解决方案的输出应该匹配的输出示例解决方案。为了清楚 起见,延迟秒数,间隔打印作业时,当它到达开始打印。总延迟是所有 打印作业的总延迟,和平均延迟是所有打印作业的平均延时。 (2) 简短描述抽象数据类型或设计的函数描述,说明为什么 要使用这种抽象数据类型,并说明你的解决设想 queue<event> a; 建立一个存放event的队列对象a。 把按wait_until顺序从workload中的event导出,再依次把event对应 的job任务计算出打印的时间点printtime,存入新构造的event的 wait_until域中,最后这些event按打印时间将存入a队列中。 (3) 简短明确地写出你实验所采用的存储结构及其用途,详 细说明其中的属性的含义。
东北大学数据结构上机实验报告
实验一线性表应用一、实验目的对图书馆的图书信息管理作一个简单的模拟。
二、实验要求设计图书信息管理的模拟程序。
1)采用顺序表登录图书成绩。
2)可以登记、查询、插入、删除图书成绩。
3)将图书信息按类别存储到链表中。
输入形式图书信息输出形式图书信息程序功能登记、查询、插入、删除图书成绩三、设计概要流程图抽象数据类型的定义图书类型typedef struct {int num; //书号char name[20]; //书名char author[20]; //作者char press[20]; //出版社名称int count; //存馆数量char price[10]; //定价} ElemType;单链表结点类型typedef struct LNode{ElemType data;struct LNode *next;} LinkList;各程序模块之间的调用关系四、详细设计初始化创建头结点实现线性表的初始化L = (LinkList *) malloc(sizeof(LinkList));L->next = NULL;用户界面运用printf函数录入int i, n;LinkList *s, *q, *p; //创建单链表p = L;while (p->next != NULL )p = p->next;printf("请输入需要录入的图书信息的个数:n=");scanf("%d", &n);for (i = 1; i < n + 1; i++) { //创建图书信息s = (LinkList *) malloc(sizeof(LinkList));printf("书号书名作者出版社名称存馆数量定价\n");scanf("%d%s%s%s%d%s", &s->data.num, s->, s->data.author,s->data.press, &s->data.count, s->data.price);q = L->next;if (q == NULL ) { //下一个节点为空即此节点为尾节点p->next = s;p = s;p->next = NULL;printf("录入成功!\n");continue;}while (q != NULL ) {if (strcmp(s->, q->) == 0) {printf("此图书已存在!");printf("请重新输入:\n");scanf("%d%s%s%s%d%s", &p->data.num, p->,p->data.author, p->data.press, &p->data.count,p->data.price);}q = q->next;}p->next = s;p = s;p->next = NULL;printf("录入成功!\n");Sleep(1000);}system("cls");menu();return 0;查询LinkList *p = L->next; //p指向第一个数据结点int c;int x = 0;char name1[10], author1[10], press1[10];printf(" 1 按书名查询:\n");printf(" 2 按作者名查询:\n");printf(" 3 按出版社名称:\n");printf(" 4 返回\n");printf(" 请选择1--4进行操作:\n");scanf("%d", &c);if (c > 4 || c < 1) {printf("您的输入有误!\n");scanf("%d", &c);}switch (c) {case 1:printf("请输入图书书名: \n");scanf("%s", name1);while (p != NULL ) {if (strcmp(name1, p->) != 0) //查找图书书名p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d\t%s\t%s\t%s\t%d\t%s", p->data.num, p->,p->data.author, p->data.press, p->data.count,p->data.price);printf("\n");p = p->next;x++;Sleep(2000);system("cls");menu();}}if (p == NULL && x == 0)printf("对不起,不存在此图书!\n");break;case 2:printf("请输入图书作者:\n");scanf("%s", author1);while (p != NULL ) {if (strcmp(author1, p->data.author) != 0) //查找图书作者p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d\t%s\t%s\t%s\t%d\t%s", p->data.num, p->,p->data.author, p->data.press, p->data.count,p->data.price);printf("\n");p = p->next;x++;Sleep(2000);system("cls");menu();}}if (p == NULL && x == 0)printf("对不起,不存在此图书!\n");break;case 3:printf("请输入图书的出版社名称: \n");scanf("%s", press1);while (p != NULL ) {if (strcmp(press1, p->data.press) != 0) //查找图书出版社名称p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d %s %s %s %d %s",p->data.num, p->, p->data.author,p->data.press, p->data.count, p->data.price);printf("\n");p = p->next;x++;Sleep(2000);system("cls");menu();}}if (p == NULL && x == 0)printf("对不起!不存在此图书\n");break;case 4:break;}五、调试分析所遇问题的解决方法及分析当我编写录入函数时,对如何将数据储存到链表中无从下手。
数据结构实验报告一
数据结构实验报告一数据结构实验报告评分满分——5分学号:20XX111990 姓名:陶瑜专业:计算机科学与技术知识范畴:线性表完成日期:20XX年03月19日实验题目:两个有序线性表的归并算法实验内容及要求:从键盘输入数据,建立两个有序线性表(每个线性表的输入数据按小到大次序输入来建立线性表,不必考虑排序算法);输出建好的这两个有序线性表;将这两个有序线性表归并为一个有序线性表;输出归并后的有序线性表。
从键盘实现数据输入与输出的格式自拟;要求完成两个同样功能的程序,一个程序采用顺序存储结构,另一个程序采用链表实现线性表的存储。
其中链表实现时,要求利用两个升序链表的结点实现归并,即归并时不能新建结点,归并后原来两个升序链表的存储空间不在存在。
实验目的:掌握两个有序线性表的归并算法。
数据结构设计简要描述:采用带附加头结点方式建立单向链表;每个结点包括整型类型的数据域和一个指针域。
第一个程序以数组的形式建立单向顺序存储的线性表,第二个程序以指针的形式建立链式存储的线性表。
算法设计简要描述:线性表排序采用比较大小交换位置的算法实现;线性表的归并采用先比较两个线性表的结点数据大小,按顺序将数据插入原线性表的方法重构链表。
输入/输出设计简要描述:从键盘输入若干整数数据,以回车作为输入结束标志,将输入数据按从小到大顺序排序好后输出。
当输入好两个线性表的数据时,回车显示归并后的线性表数据。
输出各结点的整数值时,每个整数采用6列字符域宽。
输入与输出有文字提示。
编程语言说明:使用Visual C++编程。
主要代码采用C语言实现;动态存储分配采用C的malloc和free操作符实现;输入与输出采用C++的cin和cout流;程序注释采用C/C++规范。
主要函数说明:void InitList(SqList &L); //输入若干整数,建立带附加头结点的单向顺序存储链表 void ShowList(SqList &L) //显示线性表中的所有元素SqList UnionList(SqList &L1, SqList &L2)//按从小到大的顺序归并两个顺序存储的链表void SortList(SqList &L) //线性表元素排序LinkList *CreateList //输入若干整数,建立带附加头结点的单向链式存储链表 SqList MergeList(SqList L1,SqList L2) //按从小到大顺序归并两个链式存储的有序链表程序测试简要报告:测试实例11 / 7结论程序输出结果与期望输出结果相符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
workload.pop();
}
if(!priority_waiting.empty() && time >= finish_time){
totaljob ++;
evt = priority_waiting.top();
}
bool operator < (event evtleft,event evtright){
return evtleft.getjob().getnumpages() < evtright.getjob().getnumpages();
}ቤተ መጻሕፍቲ ባይዱ
五、实验结果总结
经测试,功能较为完整。代码流程简图如下:
通过这次实验,我了解了有关队列方面的知识。掌握了队列的逻辑结构,抽象数据类型,队列的存储方式等。运用先进先出表,仿真了网络打印队列。这都使我对数据结构的学习有了新的认识与帮助。在实验过程中,我也遇到了许多困难,从开始时对队列运算的不熟悉,到逐渐查找资料,从而完成了实验。在今后的学习中,我将继续努力,加强对堆栈,队列等知识的学习,以达到精益求精。
finish_time = time + evt.getjob().getnumpages() * seconds_per_page;
}
}
osf<<"\n\ttotal job "<<totaljob<<endl;
osf<<"\taggregate latency: "<<agg_latency<<" seconds"<<endl;
job.cpp –作业类的定义
arbitrary.run –包括任意打印作业数的数据文件
arbitrary.out–输出arbitrary.run
bigfirst.run–包括打印较大作业的数据文件
bigfirst.out–输出bigfirst.run
(2)实验代码
#ifndef FIFO_H//fifo.h
这个任务队列的测试使用STL队列适配器。程序要求完成模拟的实现共享打印机。这个打印机使用先进先出队列。仿真是通过读取和处理事件数据文件的列表。一个有效的数据文件中的每一行包含信息打印作业和提交这份工作的时间。
具体地说,每一行中包含的信息是提交工作的时间(以秒为单位),和在页面的工作长及工作的计算机的名称。在模拟的开始,每个这些事件的每一个应该被程序所读,存储在继承工作负载队列。程序应该通过循环递增计数器或while-loop模拟时间的流逝。程序应该将计数器初始化为零,然后依次增加1秒。当模拟等于当前时间的打印作业的提交时间在工作队列的前面,一个打印作业完成。当这一切发生的时候,从工作队列取出这个事件,然后把它放在另一个队列<event>对象。这个队列<event>对象存储已完成的打印作业。当程序仿真其他的打印工作的时候,这些工作在队列等待。
void simulate(string file);
};
bool operator < (event evtleft,event evtright);
#endif
#include "fifo.h"//fifo.cpp
#include <FSTREAM>
using namespace std;
fifo::fifo(int seconds_per_page):simulator(seconds_per_page){
实 验 报 告
课程名称:数据结构
班级:软件赴日
实验成绩:
实验名称:打印机队列模拟程序的设计
学号:201247
批阅教师签字:
实验编号:实验一
姓名:袁
实验日期:2014年5月24日
指导教师:
组号:
实验时间:时分-时 分
一、实验目的
对队列的理解
对STL中的queue的使用
实验仿真一个网络打印过程
二、实验内容与实验步骤流程图
evt= workload.front();
osf<<"\tArriving: "<<evt.getjob()<<" at "<<time<<" seconds"<<endl;
waiting.push(workload.front());
workload.pop();
}
if(!waiting.empty() && time >= finish_time){
#define FIFO_H
#include "simulator.h"
class fifo:public simulator{
protected:
queue<event> waiting;
priority_queue<event> priority_waiting;
public:
fifo(int seconds_per_page);
六、附录
-《数据结构与算法分析》以及网上资料
string outfile = "bigfirst.out";
ofstream osf(outfile.c_str());
loadworkload(file);
osf<<"FIFO Simulation\n"<<endl;
for(int time =1;!priority_waiting.empty()||!workload.empty();time++){
osf<<"\tmean latency : "<<agg_latency / totaljob<<" seconds "<<endl;
osf.close();
cout<<"The log file name is arbitrary.out"<<endl;
return;
}
if(file.find("bigfirst") != string::npos){
}
}
osf<<"\n\ttotal job "<<totaljob<<endl;
osf<<"\taggregate latency: "<<agg_latency<<" seconds"<<endl;
osf<<"\tmean latency : "<<agg_latency / totaljob<<" seconds "<<endl;
ofstream osf(outfile.c_str());
loadworkload(file);
osf<<"FIFO Simulation\n"<<endl;
for(int time =1;!waiting.empty()||!workload.empty();time++){
while(!workload.empty() && time == workload.front().arrival_time()){
totaljob ++;
evt = waiting.front();
agg_latency += time - evt.arrival_time();
osf<<"\tServicing: "<<evt.getjob()<<" at "<<time<<" seconds"<<endl;
waiting.pop();
osf.close();
cout<<"The log file name is bigfirst.out"<<endl;
return;
}
cerr<<"The program don't know what algorithm to use"<<endl;
cerr<<"You should specify the file name with arbitrary or bigfirst"<<endl;
agg_latency += time - evt.arrival_time();
osf<<"\tServicing: "<<evt.getjob()<<" at "<<time<<" seconds"<<endl;
priority_waiting.pop();
finish_time = time + evt.getjob().getnumpages() * seconds_per_page;
流程图:
三、实验环境
Win8,Visual C++ 6.0
四、实验过程与分析
(1)实验主要函数及存储结构
main.cpp –包括主函数和主要的功能