中南大学数据结构实验报告(一)

合集下载

中南大学数据结构演示系统课程设计实验报告

中南大学数据结构演示系统课程设计实验报告

中南大学数据结构演示系统课程设计实验报告一、需求分析1、课程设计题目数据结构演示系统1(1)、顺序表的插入、删除和合并等基本操作(2)、利用插入运算建立链表;实现链表的查找、删除、计数、输出等功能以及有序链表的合并。

(3)、串的模式匹配(包括求next和nextval的值)。

2程序模块的功能要求(1)输入的形式和输入值的范围(2)顺序表和链表的输入形式是整形,输入值的范围是-32768~~32767。

串的输入形式是字符型(3)输出的形式顺序表和链表的输出形式是整形;串的输出形式是字符型。

(4)程序所能达到的功能;实现顺序表的创建、插入、删除和合并实现链表的创建、查找、删除、计数、输出和有序链表的合并实现串的模式匹配(包括求next和nextval的值)(5)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果顺序表的输入:12/26/65/65/216/898/989/2156链表输入:12/32/35/56/65/654/985二、概要设计1、定义定义顺序表的结构体typedef struct lnode{int data;struct lnode *next;}linklist;定义链表的的结构体typedef struct{int len;linklist *point;}indexlink;typedef struct{int data[MAXSIZE][MAXSIZE1+1];int len;定义串的结构体}sqlist;typedef struct{char string[MAXSIZE1];int len;}sstring;int next[MAXSIZE1];int nextval[MAXSIZE1];2 流程图(1)主界面(2)顺序表主流程图(3)顺序表插入流程图(4)链表主流程图)链表删除元素流程图(5(6)模式匹配主流程图(7)KMP求next【】流程图3各程序模块之间的层次关系(1)第一层为主界面函数,第二层为顺序表界面函数、链表界面函数、模式匹配界面函数第三层为顺序表子函数、链表子函数、模式匹配子函数(2)主界面函数调用的函数有sqlistfuc()、linklistfuc()、indexfuc()顺序表界面调用的函数有creatsq()、listinsert()、listdelete()、mergelist()链表界面调用的函数有creat()、insert()、delete()、search()、num()、linktraverse()、mergelink()、模式匹配界面调用的函数有creatstring()、KMP()三、详细设计见附录四、调试分析1、调试过程中遇到的问题是如何解决的以及对设计与实现的讨论和分析(1)一开始在在调试程序时遇到了内存错误,最终通过网上查资料找到了出错的原因:在建立对头指针和队尾指针时没有对指针进行初始化,即没有为指针动态分配空间。

中南大学数据库实验报告

中南大学数据库实验报告

中南大学数据库实验实验题目班级姓名学号一、实验内容实验一:创建表、更新表和实施数据完整性1.运行给定的SQL Script,建立数据库GlobalToyz。

2.创建所有表的关系图。

3.列出所有表中出现的约束(包括Primary key, Foreign key, check constraint, default, unique)4.对Recipient表和Country表中的cCountryId属性定义一个用户自定义数据类型,并将该属性的类型定义为这个自定义数据类型。

5.把价格在$20以上的所有玩具的材料拷贝到称为PremiumToys 的新表中。

6.对表Toys实施下面数据完整性规则:(1)玩具的现有数量应在0到200之间;(2)玩具适宜的最低年龄缺省为1。

7.不修改已创建的Toys表,利用规则实现以下数据完整性:(1)玩具的价格应大于0;(2)玩具的重量应缺省为1。

8.给id为‘000001’玩具的价格增加$1。

实验二:查询数据库1.显示属于California和Illinoi州的顾客的名、姓和emailID。

2.显示定单号码、商店ID,定单的总价值,并以定单的总价值的升序排列。

3.显示在orderDetail表中vMessage为空值的行。

4.显示玩具名字中有“Racer”字样的所有玩具的材料。

5.根据2000年的玩具销售总数,显示“Pick of the Month”玩具的前五名玩具的ID。

6.根据OrderDetail表,显示玩具总价值大于¥50的定单的号码和玩具总价值。

7.显示一份包含所有装运信息的报表,包括:Order Number,Shipment Date, Actual Delivery Date, Days in Transit. (提示:Days in Transit = Actual Delivery Date –Shipment Date)8.显示所有玩具的名称、商标和种类(Toy Name, Brand, Category)。

数据结构实验报告_实验报告_

数据结构实验报告_实验报告_

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。

数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。

本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。

2) 利用栈,实现任一个表达式中的语法检查(选做)。

3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。

中南大学 计算机体系结构实验报告

中南大学 计算机体系结构实验报告

计算机体系结构课程设计学院:信息科学与工程学院专业班级:指导老师:学号:姓名:目录实验 1 对指令操作码进行霍夫曼编码 (3)一、实验目的 (3)二、实验内容 (3)三、设计思路 (4)四、关键代码 (4)五、实验截图 (5)六、源代码 (5)实验 2 使用LRU 方法更新Cache (8)一、实验目的 (8)二、实验内容 (8)三、设计思路 (9)四、程序截图 (9)五、实验代码 (9)实验总结 (16)参考文献 (16)实验1 对指令操作码进行霍夫曼编码一、实验目的了解和掌握指令编码的基本要求和基本原理二、实验内容1. 使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对指令码的长度进行评价。

与扩展操作码和等长编码进行比较。

2. 问题描述以及问题分析举例说明此问题,例如:P1P2P3P4P5P6P70.450.300.150.050.030.010.01下表所示:对此组指令进行HUFFMAN 编码正如下图所示:最后得到的HUFFMAN 编码如下表所示:P1P2P3P4P5P6P7 010110111011110111110111111最短编码长度为:H=0.45*1+0.30*2+0.15*3+0.05*4+0.03*5+0.01*6+0.01*6=-1.95.要对指令的操作码进行HUFFMAN 编码,只要根据指令的各类操作码的出现概率构造HUFFMAN 树再进行HUFFAM 编码。

此过程的难点构造HUFFMAN 树,进行HUFFAM 编码只要对你所生成的HUFFMAN 树进行中序遍历即可完成编码工作。

三、设计思路观察上图,不难看出构造HUFFMAN 树所要做的工作:1、先对各指令操作码的出现概率进行排序,构造一个有序链表。

2、再取出两个最小的概率节点相加,生成一个生的节点加入到链表中,同时从两表中删除此两个节点。

3、在对链表进行排序,链表是否只有一个节点,是则HUFFAN 树构造完毕,否则继续做 2 的操作。

数据结构实验报告2篇

数据结构实验报告2篇

数据结构实验报告数据结构实验报告精选2篇(一)实验目的:1. 熟悉数据结构的基本概念和基本操作;2. 掌握线性表、栈、队列、链表等经典数据结构的实现方法;3. 掌握数据结构在实际问题中的应用。

实验内容:本次实验主要包括以下几个部分:1. 线性表的实现方法,包括顺序表和链表,分别使用数组和链表来实现线性表的基本操作;2. 栈的实现方法,包括顺序栈和链式栈,分别使用数组和链表来实现栈的基本操作;3. 队列的实现方法,包括顺序队列和链式队列,分别使用数组和链表来实现队列的基本操作;4. 链表的实现方法,包括单链表、双链表和循环链表,分别使用指针链、双向链和循环链来实现链表的基本操作;5. 综合应用,使用各种数据结构来解决实际问题,例如使用栈来实现括号匹配、使用队列来实现马铃薯游戏等。

实验步骤及结果:1. 线性表的实现方法:a) 顺序表的基本操作:创建表、插入元素、删除元素、查找元素等;b) 链表的基本操作:插入节点、删除节点、查找节点等;c) 比较顺序表和链表的优缺点,分析适用场景。

结果:通过实验,确认了顺序表适用于频繁查找元素的情况,而链表适用于频繁插入和删除节点的情况。

2. 栈的实现方法:a) 顺序栈的基本操作:进栈、出栈、判空、判满等;b) 链式栈的基本操作:进栈、出栈、判空、判满等。

结果:通过实验,掌握了栈的基本操作,并了解了栈的特性和应用场景,例如括号匹配。

3. 队列的实现方法:a) 顺序队列的基本操作:入队、出队、判空、判满等;b) 链式队列的基本操作:入队、出队、判空、判满等。

结果:通过实验,掌握了队列的基本操作,并了解了队列的特性和应用场景,例如马铃薯游戏。

4. 链表的实现方法:a) 单链表的基本操作:插入节点、删除节点、查找节点等;b) 双链表的基本操作:插入节点、删除节点、查找节点等;c) 循环链表的基本操作:插入节点、删除节点、查找节点等。

结果:通过实验,掌握了链表的基本操作,并了解了链表的特性和应用场景。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。

具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。

2、理解栈和队列的特性,并能够实现其基本操作。

3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。

4、学会使用图的数据结构,并实现图的遍历和相关算法。

二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。

三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。

实现顺序表的初始化、插入、删除和查找操作。

2、链表的实现定义链表的节点结构,包含数据域和指针域。

实现链表的创建、插入、删除和查找操作。

(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。

实现栈的入栈、出栈和栈顶元素获取操作。

2、队列的实现采用循环队列的方式实现队列的数据结构。

完成队列的入队、出队和队头队尾元素获取操作。

(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。

2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。

3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。

(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。

2、图的遍历实现深度优先遍历和广度优先遍历算法。

四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。

删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。

2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。

(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。

入栈和出栈操作的时间复杂度均为 O(1)。

2、队列队列的特点是先进先出,常用于排队、任务调度等场景。

数据结构的实训报告结果

数据结构的实训报告结果

一、实训目的本次数据结构实训旨在通过实践操作,加深对数据结构理论知识的理解,提高解决实际问题的能力。

通过实训,使学生能够熟练掌握各种基本数据结构及其操作方法,并能够将这些知识应用于解决实际问题。

二、实训环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 20194. 实训教材:《数据结构》(C语言版)三、实训内容本次实训主要内容包括线性表、栈、队列、树、图等基本数据结构的创建、操作和应用。

1. 线性表(1)单链表的创建、插入、删除和查找操作(2)双向链表的创建、插入、删除和查找操作(3)循环链表的创建、插入、删除和查找操作2. 栈(1)栈的创建、入栈、出栈和判断栈空操作(2)应用栈实现括号匹配3. 队列(1)队列的创建、入队、出队和判断队列空操作(2)应用队列实现广度优先搜索4. 树(1)二叉树的创建、插入、删除和遍历操作(2)二叉查找树的创建、插入、删除和查找操作5. 图(1)图的创建、添加边、删除边和遍历操作(2)图的深度优先遍历和广度优先遍历四、实训过程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(线性表)

中南大学数据结构实验报告1(线性表)

实验一线性表的操作算法一、实验目的:1了解线性表的逻辑结构和存储结构,以及定义在逻辑结构上的各种基本运算2分别以数组和链表为存储结构,实现线性表的插入,删除,查找,排序,合并等操作二、实验内容:用C/C++语言编写程序,分别以数组和链表为存储结构,完成以下功能:1输入数据,创建一个线性表2可在线性表的任意位置插入新结点3可删除线性表的任意一个结点4可在线性表中查找结点5将线性表从小至大排序6将两个线性表合并三、详细设计:顺序表#include<iostream>using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct { //结构体ElemType *elem;int length;int listsize;}SqList;SqList Lx;Status InitList_Sq(SqList &L) //分配空间{ L.elem=new ElemType[LIST_INIT_SIZE];if(!L.elem)exit(OVERFLOW);L.length =0;L.listsize=LIST_INIT_SIZE;return OK;}Status ListInsert(SqList &L,int i,ElemType e) //插入新元素{ int *q,*p;ElemType *newbase;if(i<1 || i>L.length+1) return ERROR;if(L.length>=L.listsize){ newbase=new ElemType[L.listsize+LISTINCREMENT];if(!newbase) exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);for (p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L.length;return OK;}Status Listlength(SqList L) //长度{ int *p=L.elem; //判断线形表是否存在while(p){ return (L.length); }}Status GetElem(SqList L, int i,ElemType &e) //取元素{ if(i<1 || i>L.length)return ERROR;else{ e=L.elem[i-1];return e;}}void MergeList(SqList La,SqList Lb,SqList &Lc) //合并{ ElemType ai,bj;InitList_Sq(Lc);int i=1,j=1,k=0;int La_len,Lb_len;La_len=Listlength(La);Lb_len=Listlength(Lb);while((i<=La_len)&&(j<=Lb_len)){ GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai<=bj){ ListInsert(Lc,++k,ai);++i; }else{ ListInsert(Lc,++k,bj);++j; }}while(i<=La_len){ GetElem(La,i++,ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len){ GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);}}void show(SqList L,int i) //显示{ int j;ElemType k;cout<<"顺序表显示如下:"<<endl;for(j=0;j<i-1;j++){ k=L.elem[j];cout<<k<<"->"; }if(j==i-1 && i>0){ k=L.elem[j]; cout<<k; }cout<<endl;}void create(SqList &L,int n) //输入元素{ int e;for(int i=0;i<n;i++){ cin>>e;L.elem[i]=e;L.length=i+1; }}Status ListDelete_Sq(SqList &L,int i,ElemType &e) //删除{ ElemType *p, *q;if(i<1 || i>L.length) return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for(++p;p<=q;++p) *(p-1)=*p;--L.length;return OK;}Status Listxiugei(SqList &L,int i,ElemType &e) //修改{ if(i<1 || i>L.length)return ERROR;else{ L.elem[i-1]=e;return OK; }}void shuru(SqList &L1) //顺序表的创建{ int a;InitList_Sq(L1);cout<<"请输入顺序表的长度:";cin>>a;cout<<"请输入顺序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);}void shanchu(SqList &L1) //删除顺序表里的元素{ int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要删除元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>j; }ListDelete_Sq(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a-1);}void charu(SqList &L1) //插入元素到顺序表里{ int a; int j; ElemType e1;a=L1.length;cout<<"请选择所要插入元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>j; }cout<<"要插入的元素:";cin>>e1;ListInsert(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a+1);}void hebing(SqList &L3) //合并两个顺序表{ SqList L1,L2;int a,b;InitList_Sq(L1); InitList_Sq(L2);cout<<"请输入第一个有序表的长度:"; cin>>a;cout<<"请输入第一个有序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);cout<<"请输入第二个有序表的长度:"; cin>>b;cout<<"请输入第二个有序表的元素(共"<<b<<"个)"<<endl;create(L2,b);show(L2,b);MergeList(L1,L2,L3);cout<<"合并后的有序表如下:"; show(L3,a+b);}void main() //主菜单{ int choice;for(;;){ cout<<"顺序表的基本操作"<<endl;cout<<"1.顺序表的创建"<<endl;cout<<"2.顺序表的显示"<<endl;cout<<"3.顺序表的长度"<<endl;cout<<"4.插入元素到顺序表里"<<endl;cout<<"5.删除顺序表里的元素"<<endl;cout<<"6.合并两个顺序表"<<endl;cout<<"7.退出系统"<<endl;cout<<"请选择:";cin>>choice;switch(choice){ case 1: shuru(Lx);break;case 2: show(Lx,Lx.length);break;case 3: cout<<"顺序表的长度:"<<Listlength(Lx)<<endl;break;case 4: charu(Lx);break;case 5: shanchu(Lx);break;case 6: hebing(Lx);break;case 7: cout<<"退出系统!"<<endl;exit(0);break;default : cout<<"输入有误,请重新选择"<<endl;break; }}}链表#include<iostream>using namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode //存储结构{ ElemType data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n) //尾插法创建单链表{ LinkList p;L=new LNode;L->next=NULL; //建立一个带头结点的单链表LinkList q=L; //使q指向表尾for(int i=1;i<=n;i++){ p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p; }}Status GetElem(LinkList L,int i,ElemType &e)//取第i个元素{ LinkList p=L->next;int j=1;while(p&&j<i){ p=p->next;++j; }if(!p||j>i) return error; //第i个元素不存在e=p->data;return ok;}Status LinkInsert(LinkList &L,int i,ElemType e) //插入{ LinkList p=L;int j=0;while(p&&j<i-1){ p=p->next;++j; } //寻找第i-1个结点 if(!p||j>i-1)return error; //i小于1或者大于表长加1 LinkList s=new LNode; //生成新结点s->data=e;s->next=p->next; //插入L中p->next=s;return ok;}Status ListDelete(LinkList &L,int i,ElemType &e) // 删除{ LinkList p=L;LinkList q;int j=0;while(p->next&&j<i-1){ //寻找第i个结点,并令p指向其前驱 p=p->next;++j; }if(!(p->next)||j>i-1) return error; //删除位置不合理q=p->next;p->next=q->next; //删除并释放结点e=q->data;delete(q);return ok;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) { //合并两个顺序链表LinkList pa,pc,pb;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; }else{ pc->next=pb;pc=pb;pb=pb->next; }}pc->next=pa?pa:pb;delete(Lb);}void show(LinkList L) //显示{ LinkList p;p=L->next;while(p){ cout<<p->data<<"-->";p=p->next; }cout<<endl;}int Length(LinkList L,int i) //表长{ i=0;LinkList p=L->next;while(p){ ++i;p=p->next; }return i;}void xiugai(LinkList L) //修改{ int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<"请输入要修改的元素位置(0<i<length):";cin>>i;GetElem(L,i,e);cout<<"该位置的元素:"<<e<<endl;cout<<"修改后的元素值:";cin>>k;while(p&&j<i){ p=p->next;++j; }m=p->data;p->data=k;cout<<"修改后的单链表显示如下:"<<endl;show(L);}void hebing() //合并两个单链表{ int a,b;LinkList La,Lb,Lc;cout<<"请输入第一个有序链表的长度:"<<endl;cin>>a;cout<<"请输入第一个有序链表的元素共("<<a<<"个):"<<endl;CreateList(La,a);show(La);cout<<"请输入第二个有序链表的长度:"<<endl;cin>>b;cout<<"请输入第二个有序链表的元素共("<<b<<"个):"<<endl;CreateList(Lb,b);show (Lb);MergeList(La,Lb,Lc);cout<<"合并后的有序链表如下:"<<endl;show(Lc);}void main() //主函数{ int select;int x;ElemType y;LinkList list;for(;;){ cout<<"单链表的基本操作"<<endl;cout<<"1.单链表的创建"<<endl;cout<<"2.单链表的显示"<<endl;cout<<"3.单链表的长度"<<endl;cout<<"4.插入元素到单链表里"<<endl;cout<<"5.删除单链表里的元素"<<endl;cout<<"6.合并两个单链表"<<endl;cout<<"7.退出系统"<<endl;cout<<"请选择:";cin>>select;switch(select){ case 1:cout<<"请输入单链表的长度:"<<endl;cin>>x;cout<<"请输入"<<x<<"个元素"<<endl;CreateList(list,x);break;case 2: cout<<"单链表显示如下:"<<endl;show(list);break;case 3: int s;cout<<"单链表的长度为:"<<Length(list,s)<<endl;break;case 4: cout<<"请选择要插入的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>x; }cout<<"要插入的元素值:";cin>>y;LinkInsert( list,x,y);cout<<"插入后单链表显示如下:"<<endl;show(list);break;case 5: cout<<"请选择要删除的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>x; }ListDelete(list,x,y);cout<<"要删除的元素值:"<<y<<endl;cout<<"删除后的单链表显示如下:"<<endl;show(list);break;case 6: hebing();break;case 7: exit(0);break;default : cout<<"输入有误,请重新输入"<<endl;break;}}}四、实验结果:顺序表链表。

中南大学数据库实验报告1

中南大学数据库实验报告1

数据库实验报告实验2数据库与表的操作【实验目的与要求】1.熟悉SQLSERVER2005或以上版本的安装,以及基本操作;2.熟练掌握数据库的创建方法,以及相关参数的设置;3.掌握数据表的创建、编辑、删除操作;4.掌握数据表数据的操作;5.数据导入导出。

【实验内容与步骤】在地籍空间数据库中,存在界址点(点号、X、Y)、宗地(宗地号、权属人、地点、面积)、街坊(编号、名称、负责人、联系电话)、宗地图纸(图号、图名、测量员、测量日期)、测量单位(单位编号、单位名称、负责人、联系电话)、测量员(工号、姓名、职称)实体,实体关系如下:一个界址点可以属于多个宗地,一个宗地由多个界址点构成,一个宗地只能属于一个街坊,一个街坊有多个宗地,一个宗地有一张宗地图,一张宗地图由一个测量员测量并制图,一个测量员属于一个测量单位,一个测量单位由多个测量人员组织。

1.给Management Studio创建新连接对象,使用2种以上方法停止、开启MSSQLSERVER服务;2.使用Management Studio界面创建数据库Cadastre;3.使用SQL语句创建数据库Cadastre;CREATE DATABASE[Cadastre]ON PRIMARY(NAME='Cadastre',FILENAME='D:\Cadastre.mdf',SIZE=5MB ,MAXSIZE=50MB, FILEGROWTH= 10% )LOG ON(NAME='Cadastre_log',FILENAME='D:\Cadastre_log.ldf',SIZE=2MB,MAXSIZE= 5MB ,FILEGROWTH=1MB)4.利用ManagementStudio界面创建界址点、宗地两个数据表;找到新建的数据库Cadastre-表-右键-新建表,设置相关信息,最后保存,为表起个名字。

数据结构实验实训总结报告

数据结构实验实训总结报告

一、实验背景随着计算机技术的飞速发展,数据结构作为计算机科学的重要基础,已经成为现代软件开发和数据处理的关键技术。

为了提高学生的数据结构应用能力,我们学校开设了数据结构实验实训课程。

本课程旨在通过实验实训,使学生深入理解数据结构的基本概念、性质、应用,掌握各种数据结构的实现方法,提高编程能力和解决实际问题的能力。

二、实验内容本次数据结构实验实训主要包括以下内容:1. 数据结构的基本概念和性质通过实验,使学生掌握线性表、栈、队列、串、树、图等基本数据结构的概念、性质和应用场景。

2. 数据结构的存储结构通过实验,使学生熟悉线性表、栈、队列、串、树、图等数据结构的顺序存储和链式存储方法,了解不同存储结构的优缺点。

3. 数据结构的操作算法通过实验,使学生掌握线性表、栈、队列、串、树、图等数据结构的插入、删除、查找、遍历等基本操作算法。

4. 数据结构的实际应用通过实验,使学生了解数据结构在各个领域的应用,如网络数据结构、数据库数据结构、人工智能数据结构等。

三、实验过程1. 实验准备在实验开始前,教师首先对实验内容进行讲解,使学生了解实验目的、实验步骤和实验要求。

同时,教师要求学生预习实验内容,熟悉相关理论知识。

2. 实验实施(1)线性表:通过实现线性表的顺序存储和链式存储,实现插入、删除、查找等操作。

(2)栈和队列:通过实现栈和队列的顺序存储和链式存储,实现入栈、出栈、入队、出队等操作。

(3)串:通过实现串的顺序存储和链式存储,实现串的插入、删除、查找等操作。

(4)树:通过实现二叉树、二叉搜索树、平衡二叉树等,实现树的插入、删除、查找、遍历等操作。

(5)图:通过实现图的邻接矩阵和邻接表存储,实现图的插入、删除、查找、遍历等操作。

3. 实验总结实验结束后,教师组织学生进行实验总结,总结实验过程中的收获和不足,提出改进措施。

四、实验成果通过本次数据结构实验实训,学生取得了以下成果:1. 掌握了数据结构的基本概念、性质和应用场景。

数据结构第一次实验报告

数据结构第一次实验报告

数据结构第一次实验报告实验报告:数据结构第一次实验摘要:本次实验旨在通过实践操作,加深对数据结构的理解,并掌握数据结构的基本操作。

实验中,我们使用C++编程语言实现了链表、栈和队列的相关操作,并对其进行了测试和分析。

实验结果表明,我们成功地完成为了链表、栈和队列的实现,并验证了它们的正确性和效率。

1. 引言数据结构是计算机科学中的重要基础课程,它研究数据的组织方式和存储结构,以及对数据进行操作和处理的方法。

本次实验旨在通过实践操作,加深对数据结构的理解,并掌握数据结构的基本操作。

2. 实验目的- 熟悉链表、栈和队列的基本概念;- 掌握链表、栈和队列的基本操作;- 分析链表、栈和队列的时间复杂度。

3. 实验方法3.1 链表的实现我们使用C++编程语言实现了链表的基本操作,包括创建链表、插入节点、删除节点和打印链表等。

具体实现过程如下:- 定义一个链表节点结构体,并在结构体中定义节点的数据域和指针域;- 创建链表,即定义一个头节点,并设置头节点的指针域为空;- 插入节点,即在链表中指定位置插入一个新节点;- 删除节点,即删除链表中指定位置的节点;- 打印链表,即遍历链表并输出节点的数据。

3.2 栈的实现我们使用C++编程语言实现了栈的基本操作,包括入栈、出栈和判断栈是否为空等。

具体实现过程如下:- 定义一个栈结构体,并在结构体中定义一个数组和一个指针top,用于存储栈元素和指示栈顶位置;- 入栈,即将一个元素压入栈中,同时将指针top向上挪移一个位置;- 出栈,即将栈顶元素弹出栈,同时将指针top向下挪移一个位置;- 判断栈是否为空,即判断指针top是否指向栈底。

3.3 队列的实现我们使用C++编程语言实现了队列的基本操作,包括入队、出队和判断队列是否为空等。

具体实现过程如下:- 定义一个队列结构体,并在结构体中定义一个数组、一个指针front和一个指针rear,用于存储队列元素和指示队首和队尾位置;- 入队,即将一个元素插入队列尾部,同时将指针rear向后挪移一个位置;- 出队,即将队首元素删除,同时将指针front向后挪移一个位置;- 判断队列是否为空,即判断指针front和指针rear是否相等。

中南大学结构试验报告

中南大学结构试验报告

结构实验报告班级:土木x班专业:xxxxxx学号:xxxxxxxxxxx姓名:xxxx目录实验一电阻应变片的粘贴及防潮技术 (2)实验二静态电阻应变仪单点接桥练习 (4)实验三简支钢桁架梁静载试验 (9)实验四钢筋混凝土简支梁静载试验 (14)实验五测定结构动力特性与动力反应 (21)实验六钢筋混凝土结构无损检测 (27)实验一电阻应变片的粘贴及防潮技术一、试验目的1.了解应变片选取的原则及质量鉴别方法;2.掌握应变片的粘贴技术。

二、仪器和设备1.电阻应变片(型号:3mm×2mm;灵敏系数:2.08)、连接端子、连接导线;2.惠斯登电桥、放大镜、高阻表;3.万能试验机、静态电阻应变仪、螺丝刀;4.打磨机、砂布、铅笔;5.丙酮(或无水酒精)、药棉、镊子;6.剥线钳、剪刀、白胶布、绝缘胶布;7.502胶水(或环氧树脂)、塑料膜;8.直尺、游标卡尺。

三、试验步骤1.划线定位:在钢片上选定应变片位置划出十字线,且深度适中。

2.砂纸打磨钢片表面,使其符合光洁度要求。

3.清洁表面:用棉纱沾丙酮清洁打磨位置表面,清洁后不可用手指触碰。

4.对正调整:用透明胶带将应变片与钢片位置临时固定,移动胶带使其到达正确位置。

5.涂胶粘贴:在应变片反面滴一滴胶水,拇指按压挤出多余胶水。

6.粘贴接件:将应变片接线拉起至根部,在紧连应变片的下部用胶水粘接一片连接片。

7.焊接引线:将应变片引线焊接在接线片上,焊点要求光滑牢固。

8.焊接导线:把连接应变仪的导线焊接在接线片上,并用绝缘胶带固定在钢片上。

9.检验:用高阻表检验连接好的应变片电阻值。

四、现场图片划线定位打磨清洗粘贴按压焊接引线焊接导线电阻检验五、心得体会通过这次试验我知道了电阻应变片是根据电阻应变效应作成的传感器。

在发生机械变形时,电阻应变片的电阻会发生变化。

使用时,用粘合剂将应变计贴在被测试件表面上,试件变形时,应变计的敏感栅与试件一同变形,使其电阻发生变化,在有测量电路将电阻变化转化为电压或电流的变化。

数据结构实验报告(实验)

数据结构实验报告(实验)

数据结构实验报告(实验)数据结构实验报告(实验)1. 实验目的1.1 理解数据结构的基本概念和操作1.2 学会使用数据结构解决实际问题1.3 掌握常用数据结构的实现和应用2. 实验环境2.1 操作系统:Windows 102.2 编程语言:C++2.3 开发工具:Visual Studio3. 实验内容3.1 实验一:线性表的实现和应用3.1.1 设计并实现线性表的基本操作函数3.1.2 实现线性表的插入、删除、查找等功能 3.1.3 实现线性表的排序算法3.1.4 应用线性表解决实际问题3.2 实验二:栈和队列的实现和应用3.2.1 设计并实现栈的基本操作函数3.2.2 设计并实现队列的基本操作函数3.2.3 实现栈和队列的应用场景3.2.4 比较栈和队列的优缺点3.3 实验三:树的实现和应用3.3.1 设计并实现二叉树的基本操作函数3.3.2 实现二叉树的创建、遍历和查找等功能3.3.3 实现树的遍历算法(前序、中序、后序遍历)3.3.4 应用树解决实际问题4. 数据结构实验结果4.1 实验一的结果4.1.1 线性表的基本操作函数实现情况4.1.2 线性表的插入、删除、查找功能测试结果4.1.3 线性表的排序算法测试结果4.1.4 线性表解决实际问题的应用效果4.2 实验二的结果4.2.1 栈的基本操作函数实现情况4.2.2 队列的基本操作函数实现情况4.2.3 栈和队列的应用场景测试结果4.2.4 栈和队列优缺点的比较结果4.3 实验三的结果4.3.1 二叉树的基本操作函数实现情况4.3.2 二叉树的创建、遍历和查找功能测试结果 4.3.3 树的遍历算法测试结果4.3.4 树解决实际问题的应用效果5. 实验分析与总结5.1 实验问题与解决方案5.2 实验结果分析5.3 实验总结与心得体会6. 附件附件一:实验源代码附件二:实验数据7. 法律名词及注释7.1 版权:著作权法规定的对原创作品享有的权利7.2 专利:国家授予的在一定时间内对新型发明享有独占权利的证书7.3 商标:作为标识企业商品和服务来源的标志的名称、符号、图案等7.4 许可协议:指允许他人在一定条件下使用自己的知识产权的协议。

数据结构实践报告文库版

数据结构实践报告文库版

数据结构实践报告文库版一、实践背景数据结构是计算机科学中的基础课程,通过学习和实践数据结构,可以增强学生对计算机系统底层原理的理解,培养学生的编程能力和问题解决能力。

本实践报告主要介绍了我在学习数据结构课程过程中的实践经验和学习成果。

二、实践内容本次实践主要包括以下几个方面:1.线性表:学习并实现了线性表的顺序存储结构和链式存储结构,并比较两种结构的优缺点。

通过实践,我深入理解了线性表的基本概念和操作,对于线性表的插入、删除和查找等操作也有了较为熟练的掌握。

2.栈与队列:学习并实现了栈和队列的基本操作,并通过实践中的应用场景,如括号匹配、迷宫求解等,加深了对栈和队列的理解。

通过实践,我发现栈和队列的应用非常广泛,对于问题的解决具有很强的实用性。

3.树与二叉树:学习并实现了树和二叉树的基本操作,如创建、遍历等,并通过实践中的应用场景,如表达式树、赫夫曼树等,进一步了解了树和二叉树的特点和应用。

通过实践,我发现树和二叉树在算法设计和数据处理中发挥着重要的作用,对于复杂问题的解决具有很大的帮助。

4.图:学习并实现了图的基本操作,如创建、遍历等,并通过实践中的应用场景,如最短路径问题、图的连通性等,加深了对图的理解。

通过实践,我认识到图是一种重要的数据结构,广泛应用于网络、社交等领域,对于解决复杂的关系问题具有重要作用。

三、实践成果通过对数据结构的学习和实践,我取得了如下成果:1.编程能力的提升:通过实践,我进一步熟悉了C/C++语言的基本语法和程序设计思想,提高了编程能力。

在实践过程中,我学会了如何分析问题、设计算法,并用代码实现,提高了自己的解决问题的能力。

2.问题解决能力的增强:通过实践过程,我掌握了一些常见问题的解决方法,如括号匹配、迷宫求解等。

在实践过程中,我学会了如何分析问题的特点和要求,选用合适的数据结构和算法进行解决,提高了解决问题的效率和质量。

3.学习能力的提高:通过实践,我更加深入地理解了数据结构的基本概念、操作和应用。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过本次实验,旨在加深对常见数据结构(如数组、链表、栈、队列、树、图等)的理解和运用,提高编程能力和问题解决能力,培养算法设计和分析的思维。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、实验内容1、数组与链表的实现与操作分别实现整数数组和整数链表的数据结构。

实现数组和链表的插入、删除、查找操作,并比较它们在不同操作下的时间复杂度。

2、栈与队列的应用用数组实现栈结构,用链表实现队列结构。

模拟栈的入栈、出栈操作和队列的入队、出队操作,解决实际问题,如表达式求值、任务调度等。

3、二叉树的遍历构建二叉树的数据结构。

实现先序遍历、中序遍历和后序遍历三种遍历算法,并输出遍历结果。

4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。

实现图的深度优先搜索(DFS)和广度优先搜索(BFS)算法,并分析它们的时间复杂度。

四、实验步骤1、数组与链表数组的实现:定义一个固定大小的整数数组,通过索引访问和操作数组元素。

链表的实现:定义链表节点结构体,包含数据和指向下一个节点的指针。

插入操作:对于数组,若插入位置在末尾,直接赋值;若不在末尾,需移动后续元素。

对于链表,找到插入位置的前一个节点,修改指针。

删除操作:数组需移动后续元素,链表修改指针即可。

查找操作:数组通过索引直接访问,链表需逐个节点遍历。

2、栈与队列栈的实现:用数组模拟栈,设置栈顶指针。

队列的实现:用链表模拟队列,设置队头和队尾指针。

入栈和出栈操作:入栈时,若栈未满,将元素放入栈顶,栈顶指针加 1。

出栈时,若栈不为空,取出栈顶元素,栈顶指针减 1。

入队和出队操作:入队时,在队尾添加元素。

出队时,取出队头元素,并更新队头指针。

3、二叉树构建二叉树:采用递归方式创建二叉树节点。

先序遍历:先访问根节点,再递归遍历左子树,最后递归遍历右子树。

中序遍历:先递归遍历左子树,再访问根节点,最后递归遍历右子树。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一1.需求分析1.单向链表操作的实现(验证性实验)问题描述(1) 用头插法(或尾插法)建立带头结点的单向链表。

(2) 对已建立的单向链表实现插入、删除、查找等基本操作。

2.城市链表(设计性实验)问题描述将若干城市的信息存入一个带头结点的单向链表。

结点中的城市信息包括城市名、城市的位置坐标。

要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。

基本要求(1) 给定一个城市名,返回其位置坐标。

(2) 给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。

测试数据由读者依据软件工程的测试技术自己确定。

注意测试边界数据4.长整数运算(综合性实验)问题描述设计一个程序实现两个任意长的整数求和运算。

基本要求利用双向循环链表实现长整数的存储,每个结点含一个整型变量。

任何整型变量的范围是−(215−1)~(215−1)。

输入和输出形式:每4位一组,组间用逗号隔开。

测试数据(1) 0和0,应输出“0”。

(2) −2345,6789,−7654,3211,应输出“−1,0000,0000”。

(3) −9999,9999,1,0000,0000,0000,应输出“9999,0000,0001”。

362 附录(4) 1,0001,000,−1,0001,0001,应输出“0”。

(5) 1,0001,0001,−1,0001,0000,应输出“1”。

实现提示(1) 每个结点中可以存放的最大整数为215−1=32 767,这样才能保证两数相加不会溢出。

但若按32 768进制数存放,在十进制数与32768进制数之间的转换十分不方便,故可以在每个结点中仅存放十进制数的4位,即不超过9 999的非负整数,整个链表视为万进制数。

(2) 可以利用头结点数据域的符号代表长整数的符号。

用其绝对值表示元素结点数目。

相加过程中不要破坏两个操作数链表。

两操作数的头指针存于指针数组中是简化程序结构的一种方法。

不能给长整数位数规定上限。

2.概要设计⏹验证性实验函数:⏹设计性实验函数:⏹综合性实验函数:3.详细设计⏹验证性实验#include<stdio.h>#include<stdlib.h> typedef struct node //节点{int data;struct node *next;} node;int length(node *head) {//返回链表长度,算上头节点int len =0;node *p = head;while(p !=NULL){len++;p =p->next;}return len;}void Init(node *head){//带头节点if(head ==NULL){printf("malloc fail in main\n");return;}head->data=0;//头节点存链长,且头节点不计入链长// printf("%d",head->data);head->next=NULL;}void Insert(node *head,int e,int pos){//在第pos个节点后插入新节点if(pos >length(head)|| pos <0)//不合法位置{printf("illegal position in Insert\n");return;}node *p = head;for(int i = pos; i >1; i--)//找到插入位置{p =p->next;}node *x =(node *)malloc(sizeof(node));//要插入的节点if(x ==NULL){printf("malloc fail in Insert");return;}x->data= e;x->next=p->next;p->next= x;head->data++;}void Delete(node *head,int*e,int pos){//删除第pos个节点if(pos >length(head)|| pos <0)//非法位置{printf("illegal position in Delete\n");return;}node *p = head;//当前指针node *p_pre;//当前指针的前驱for(int i = pos; i >=1; i--)//找到位置{p_pre = p;p =p->next;}p_pre->next=p->next;//将当前节点从链表中断开*e =p->data;//用e带出删掉的值free(p);head->data--;}void Inquire(node *head,int*e,int pos)//查询第pos个节点位置{if(pos >length(head)|| pos <0){printf("illegal position in Inquire\n");return;}node *p = head;for(int i = pos; i >=1; i--)//找位置{p =p->next;//下一个}*e =p->data;//用e带出查询结果printf("查询结果————第%d个节点的值为:%d",pos,*e);}void print(node *head)//将链表从头到尾打印{node *p = head;printf("当前链表有节点:%d个\n",head->data);printf("链表节点从头到尾分别为:\n");while(p->next!=NULL){p =p->next;printf("%d\n",p->data);}}void main(){node* head =(node *)malloc(sizeof(node));//在主函数中申请头节点Init(head);//初始化int*e;Insert(head,10,1);//插入Insert(head,28,2);Insert(head,30,1);// printf("hh");print(head);Delete(head, e,2);//删除print(head);Inquire(head, e,2);//查询}设计性实验#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>typedef struct info//节点中的信息{char*name;double x;double y;} info;typedef struct node//节点{info city;struct node *next;} node;int length(node *head)//返回链长度{int len =0;node *p = head;while(p !=NULL){len++;p =p->next;}return len;}void Init(node *head){//带头节点head->next=NULL;}void Insert(node *head, info city,int pos){//在第pos个节点后插入新节点if(pos >length(head)|| pos <0)//非法位置{printf("illegal position in Insert\n");return;}node *p = head;for(int i = pos; i >1; i--)//找到位置{p =p->next;}node *x =(node *)malloc(sizeof(node));//申请节点if(x ==NULL){printf("malloc fail in Insert");return;}x->city= city;x->next=p->next;p->next= x;}void Delete(node *head, info *city,int pos){//删除第pos个节点if(pos >length(head)|| pos <0)//非法位置{printf("illegal position in Delete\n");return;}node *p = head;node *p_pre = head;for(int i = pos; i >0; i--)//找到位置{p_pre = p;p =p->next;}p_pre->next=p->next;*city =p->city;free(p);}void Inquire(node *head, info *city,int pos)//查询第pos个节点的信息{if(pos >length(head)|| pos <0)//非法位置{printf("illegal position in Inquire\n");return;}node *p = head;for(int i = pos; i >0; i--)//找到位置{p =p->next;}*city =p->city;printf("the result of Inquire is: name:%s x:%f y:%f\n",city->name,city->x,city->y);}void Inquire2(node *head, info *city)//return x,y according to name in city{node *p = head;while(p !=NULL)//遍历链表{if(strcmp(city->name,p->)==0)//判断当前节点城市名与传入参数city中的城市名是否相同{city->x=p->city.x;city->y=p->city.y;printf("the address of the %s is (%f,%f)\n",city->name,city->x,city->y);return;}p =p->next;}printf("fail to find %s\n",city->name);//还没返回说明没找到}void print(node *head)//从头到尾打印该链表{node *p = head;printf("当前链表有节点:%d个\n",length(head)-1);printf("链表节点从头到尾分别为:\n");while(p->next!=NULL)//遍历{p =p->next;printf("name:%s ",p->);printf("x:%f ",p->city.x);printf("y:%f\n",p->city.y);}}double dis(info city1,info city2){//返回两城市间距离return sqrt(pow((city1.x-city2.x),2)+pow((city1.y-city2.y),2));}void Inquire_all(node* head,info point,double distance,node* new_head){//查询所有与point的距离在distance范围内的城市node* p=head;while(p->next!=NULL){//遍历p=p->next;double disReal=dis(point,p->city);if(disReal<distance){//判断是否在distance范围内Insert(new_head,p->city,1);}}}void main(){node *head =(node *)malloc(sizeof(node));//在主函数内申请头节点if(head ==NULL){printf("malloc fail in main\n");return;}Init(head);//初始化info city1 ={"hefei",1,1};Insert(head, city1,1);//插入info city2 ={"nanjing",2,2};Insert(head, city2,2);info city3 ={"shanghai",3,3};Insert(head, city3,3);print(head);//打印info city4;Delete(head,&city4,2);//删除print(head);Inquire(head,&city4,2);//查询info city ={"hefei"};Inquire2(head,&city);//根据城市名查询info point={NULL,0,0};node* new_head=(node*)malloc(sizeof(node));//用头节点为new_head的链表带出所有满足条件的城市if(new_head==NULL){#include<stdio.h>#include<stdlib.h>#include<math.h>typedef struct node//节点,双向循环链表{int num;struct node *pre;struct node *next;} node;void Init(node *head,int n)//初始化{//n是num的位数,其符号代表num的符号,位数head->next= head;head->pre= head;head->num= n;}void Insert(node *head,int e,int pos){//插在第pos个节点之后node *s =(node *)malloc(sizeof(node));//申请节点if(s ==NULL){printf("malloc fail in Insert");return;}s->num= e;node *p = head;for(int i = pos; i >1; i--)//找位置{p =p->next;}s->next=p->next;//插入p->next= s;s->next->pre= s;s->pre= p;}int length(node *head)//返回链表长度{node *p = head;int len =1;while(p->next!= head)//遍历{len++;p =p->next;}return len;}void read(node *head,int m)//从键盘读入数据{int e;int n =abs(m);//去掉符号switch(n %4){case1://若是1/5/9之类的scanf("%1d",&e);//首位只存一位数字Insert(head, e,length(head));for(int i =abs(n -1)/4; i >0; i--)//假如是9,需要三个节点存储,(除首位外)每个节点存储一个四位数{scanf("%4d",&e);Insert(head, e,length(head));}break;case2://若是2/6/10之类的scanf("%2d",&e);//首位存两位数字Insert(head, e,length(head));for(int i =abs(n -1)/4; i >0; i--){scanf("%4d",&e);Insert(head, e,length(head));}break;case3:scanf("%3d",&e);Insert(head, e,length(head));for(int i =abs(n -1)/4; i >0; i--){scanf("%4d",&e);Insert(head, e,length(head));}break;case0://若是四的整数倍for(int i =abs(n -1)/4+1; i >0; i--)//每个节点存一个四位数{scanf("%4d",&e);Insert(head, e,length(head));}break;}}void print(node *head)//打印,更清楚的算法应该是找到第一个有效数字,其之前的0都部输出,其之后的空位需要补0{node *p = head;//头指针p =p->next;//head不需要打印if(length(head)==2){//若是只有一个节点,即在四位数以内,直接打印即可,不需要补0printf("%d",p->num);}else if(length(head)>2&&p->num!=0){//若不只四位数,在首位不为0的情况下,才打印printf("%d",p->num);}int flag=0;//用来判断是否到达有效数字(数电的思想),看其从开头到现在是否一直为0,是则flag>0 if(p->num==0&&length(head)>2){//若不只四位数,在首位为0的情况下,flag==1flag=1;}while(p->next!= head)//遍历链表{p =p->next;if(flag>0&&p->num==0){//如果当前位为0,且之前一直没到有效数字flag++;//flag加一,说明已经有新的一位为0了if(flag==abs(head->num)){//如果从开头到结尾都是0,那至少打印一位数字printf("%d",p->num);return;}continue;//尚未找到有效数字时,就不打印}else if(flag>0&&p->next==head){//到了最后一位尚未打印,那么至少打印最后一位printf("%d",p->num);return;}else{//找到有效数字就将flag置0,其后的数字需要补0flag=0;}if(abs(p->num)>=0&&abs(p->num)<=9)//一位数字补三个0{printf("000%d",p->num);}else if(abs(p->num)>=10&&abs(p->num)<=99)//两位数字补两个0{printf("00%d",p->num);}else if(abs(p->num)>=100&&abs(p->num)<=999){printf("0%d",p->num);}else{printf("%d",p->num);}}printf("\n");}void add(node *head1, node *head2, node *ans)//加法和减法{//对齐数字int m =(abs(head1->num)-1)/4+1;//计算以head1位头节点的链有几个节点int n =(abs(head2->num)-1)/4+1;int sub = m - n;if(sub >0)//如果head1比较长,就给head2从首位开始补0{for(int i = sub; i >0; i--){Insert(head2,0,1);}}else if(sub <0){for(int i =abs(sub); i >0; i--){Insert(head1,0,1);}}int count = m > n ? m : n;//计算次数,看比较高的位数ans->num=count;//答案的位数//计算int flag =0;//进位与借位标志node *p1 =head1->pre;//head1的末尾node *p2 =head2->pre;int answer =0;//每个节点计算结果//两数皆为正数,加法if(head1->num>0&&head2->num>0){for(int i = count; i >0; i--){answer =p1->num+p2->num+ flag;//直接加,再加上进位标志if(answer >9999)//溢出{flag =1;//进位Insert(ans, answer %10000,1);}else if(answer >=0)//未溢出{flag =0;Insert(ans, answer,1);}p1 =p1->pre;//计算更高位p2 =p2->pre;}if(flag ==1)//如果最高位的加法还有进位{Insert(ans,1,1);//增加一个更高位}}//两数皆为负数,算完加法,添个负号即可else if(head1->num<0&&head2->num<0){for(int i = count; i >0; i--){answer =abs(p1->num)+abs(p2->num)+ flag;//当加法算if(answer >9999){flag =1;Insert(ans, answer %10000,1);}else if(answer >=0){flag =0;Insert(ans, answer,1);}p1 =p1->pre;p2 =p2->pre;}if(flag ==1)//最高位有进位{Insert(ans,-1,1);//只需要在意最高位的符号,其为负即整个长数为负数(输出的时候)}else{ans->next->num=-ans->next->num;//最高位置为负数}}//一正一负,减法,需考虑借位else{for(int i = count; i >0; i--){answer =((head1->num)/abs(head1->num))*p1->num+((head2->num)/abs(head2->n um))*p2->num+ flag;//带符号的加法if(answer >=0)//结果为非负数{flag =0;//不用借位Insert(ans, answer,1);}if(answer <0)//结果为负数,插入的其实为补码{flag =-1;//借位if(i ==1)//算到最后一次(最高位)时,插入对应位数的补码{if(answer ==0)//零直接插0Insert(ans,0,1);if(answer >0&& answer <10)//一位数Insert(ans,10+ answer,1);if(answer >=10&& answer <100)//两位数Insert(ans,100+ answer,1);if(answer >=100&& answer <1000)Insert(ans,1000+ answer,1);if(answer >=1000&& answer <10000)Insert(ans,10000+ answer,1);}else//其他位,直接补上用10000的补{Insert(ans,10000+ answer,1);}}p1 =p1->pre;//计算更高位p2 =p2->pre;}if(flag ==-1)//算到最高位还需借位的话,说明之前的(包括最高位)都是补码,需要计算补码的原码{node *p = ans;for(int i = count; i >0; i--){p =p->next;if(i ==1)//最低位没有被更低位借位,直接用10000求补p->num=10000-p->num;if(i == count)//最高位,用对应位数的来求补码{if(p->num>0&&p->num<10)p->num=p->num-9;//因为是负数,所以减9if(p->num>=10&&p->num<100)p->num=p->num-99;if(p->num>=100&&p->num<1000)p->num=p->num-999;if(p->num>=1000&&p->num<10000)p->num=p->num-9999;}else//其他位数被更低位借去了1,so用9999减p->num=9999-p->num;}}}}int main()//主函数{node *head1 =(node *)malloc(sizeof(node));//第一个数字的头节点if(head1 ==NULL){printf("malloc fail in main");return0;}printf("please enter the number of digits you will enter,whose symbol stands for the numbe r's symbol: ");int n;scanf("%d",&n);//读入数字的位数,其符号代表第一个数字的符号if(n==0){printf("illegal number");return0;}Init(head1, n);//初始化printf("please enter the first number: ");read(head1, n);//read读入第一个数字// print(head1);node *head2 =(node *)malloc(sizeof(node));//第二个数字的头节点if(head2 ==NULL){printf("malloc fail in main");return0;}printf("please enter the number of digits you will enter,whose symbol stands for the numbe r's symbol: ");int m;scanf("%d",&m);if(m==0){printf("illegal number");return0;}Init(head2, m);printf("please enter the second number: ");read(head2, m);// print(head2);node *ans =(node *)malloc(sizeof(node));//结果的头节点if(ans ==NULL){printf("malloc fail in ans of main");return0;}Init(ans,0);//初始化add(head1, head2, ans);//计算结果printf("the sum of these numbers is: ");print(ans);//打印结果}综合性实验4.调试分析1)采用IDE中自带的调试功能进行调试,手动添加断点和查看程序。

相关文档
最新文档