厦门理工数据结构实验3
- 格式:doc
- 大小:94.50 KB
- 文档页数:11
《数据结构与算法》课程设计报告(2012— 2013学年第 1 学期)专业:网络工程班级:11网络工程姓名学号:1107022144指导教师:林仙丽成绩:计算机科学与技术系2013 年01 月11 日目录一.课程设计目的与要求 (1)1.设计目的 (1)2.设计任务及要求 (1)二 .方案实现与调试 (1)1.停车场管理系统 (1)1.1算法描述及实验步骤 (2)1.2调试过程及实验结果 (3)2.字符串操作 (4)2.1算法描述及实验步骤 (5)2.2调试过程及实验结果 (6)3.找祖先 (8)3.1算法描述及实验步骤 (9)3.2调试过程及实验结果 (10)4.二叉树运算2 (8)4.1算法描述及实验步骤 (9)4.2调试过程及实验结果 (1)三.课程设计分析与总结 (10)四.源程序清单 (11)1.停车场管理系统 (11)2.字符串操作 (19)3.找祖先 (22)4.二叉树运算2 (25)五.设计日志 (31)六.指导教师评语 (32)2一. 课程设计的目的与要求(含设计指标)1、设计目的(1)培养学生运用算法与数据结构的基本知识解决实际编程中的数据结构设计和算法设计问题。
(2)培养学生独立设计程序与解决问题的能力,培养学生团队协作集成程序模块及调试能力。
(3)培养学生初步的软件设计及软件测试的能力。
2、设计任务及要求基本要求:学生必须仔细阅读《数据结构》课程设计指导书,认真主动完成课程设计的要求。
有问题及时主动通过各种方式与教师联系沟通。
学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时的向教师汇报。
课程设计按照教学要求需要一周时间完成,一周中每天(按每周5天)至少要上3-4小时的机来调试C语言设计的程序,总共至少要上机调试程序15小时。
根据设计报告要求编写设计报告,主要内容包括目的、意义、原理和实现方法简介、过程分析及说明、实验结果情况说明、结论。
《数据结构》实验报告实验序号:6 实验项目名称:树和二叉树的操作前序:-*ab++c*d/efg中序:a*b-c+d*e/f+g后序:ab*cdef/*+g+-2. 链式表表示和实现二叉树如下:#include <stdio.h>#include <stdlib.h>#define max 50root=NULL; /*千万别忘了赋初值给root!*/do{printf("please input data%d:",i);i++;scanf("%d",&x); /*从键盘采集数据,以-9999表示输入结束*/if(x==-9999){printf("\nNow output data value:\n");}elseinsert_data(x); /*调用插入数据元素的函数*/}while(x!=-9999);}改写以上程序,实现功能如下(任选两题):1.编写函数实现前序、中序和后序遍历。
运行结果截图:2.编写函数实现计算叶节点个数。
运行结果截图:四、分析与讨论代码是网上查找的,但是在理解的情况下引用的,修改调试后完成了。
成绩五、教师评语签名:日期:#include <stdio.h>#include <stdlib.h>#define max 50typedef struct liuyu{int data;struct liuyu *lchild,*rchild;}test;liuyu *root,*p,*q[max];int sum=0;int m=sizeof(test);void insert_data(int x) /*生成二叉排序树*/{liuyu *p,*q,*s;s=(test*)malloc(m);s->data=x;s->lchild=NULL;s->rchild=NULL;if(!root){root=s;}p=root;while(p) /*如何接入二叉排序树的适当位置*/ {q=p;if(p->data==x){printf("data already exist! \n");return;}else if(x<p->data)p=p->lchild;elsep=p->rchild;}if(x<q->data)q->lchild=s;elseq->rchild=s;}void Preorder(liuyu *bt) //先序遍历输出{if(bt){printf("%d ",bt->data);Preorder(bt->lchild);Preorder(bt->rchild);}}void Inorder(liuyu *bt) //中序遍历输出{if(bt){Inorder(bt->lchild);printf("%d ",bt->data);Inorder(bt->rchild);}}void Postorder(liuyu *bt) //后序遍历输出{if(bt){Postorder(bt->lchild);Postorder(bt->rchild);printf("%d ",bt->data);}}int Leafnum(liuyu *bt){int i=0,j,k;if(bt==NULL) return 0;if(bt->lchild==NULL&&bt->rchild==NULL) i++;j=Leafnum(bt->lchild);k=Leafnum(bt->rchild);return i+j+k;}void main() /*先生成二叉排序树*/{int i,x;i=1;root=NULL; /*千万别忘了赋初值给root!*/do{printf("please input data%d:",i);i++;scanf("%d",&x); /*从键盘采集数据,以-9999表示输入结束*/if(x==-9999){printf("\nNow output data value:\n");}elseinsert_data(x); /*调用插入数据元素的函数*/}while(x!=-9999);printf("先序遍历输出:");Preorder(root);printf("\n中序遍历输出:");Inorder(root);printf("\n后序遍历输出:");Postorder(root);printf("\n叶子总数为:");printf("%d\n",Leafnum(root)); }。
一、实验目的1. 理解并掌握数据结构的基本概念和常用算法。
2. 学会使用C语言实现线性表、栈、队列、树和图等基本数据结构。
3. 培养动手实践能力,提高编程水平。
二、实验内容1. 线性表(1)顺序表(2)链表2. 栈(1)顺序栈(2)链栈3. 队列(1)顺序队列(2)链队列4. 树(1)二叉树(2)二叉搜索树5. 图(1)邻接矩阵表示法(2)邻接表表示法三、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 编译器:Visual Studio 20194. 实验软件:C语言开发环境四、实验步骤1. 线性表(1)顺序表1)定义顺序表结构体2)实现顺序表的初始化、插入、删除、查找等基本操作3)编写测试程序,验证顺序表的基本操作(2)链表1)定义链表结构体2)实现链表的创建、插入、删除、查找等基本操作3)编写测试程序,验证链表的基本操作2. 栈(1)顺序栈1)定义顺序栈结构体2)实现顺序栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证顺序栈的基本操作(2)链栈1)定义链栈结构体2)实现链栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证链栈的基本操作3. 队列(1)顺序队列1)定义顺序队列结构体2)实现顺序队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证顺序队列的基本操作(2)链队列1)定义链队列结构体2)实现链队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证链队列的基本操作4. 树(1)二叉树1)定义二叉树结构体2)实现二叉树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉树的基本操作(2)二叉搜索树1)定义二叉搜索树结构体2)实现二叉搜索树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉搜索树的基本操作5. 图(1)邻接矩阵表示法1)定义邻接矩阵结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接矩阵表示法的基本操作(2)邻接表表示法1)定义邻接表结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接表表示法的基本操作五、实验结果与分析1. 线性表(1)顺序表实验结果表明,顺序表的基本操作实现正确,测试程序运行稳定。
数据结构实验3《数据结构》实验报告年级_2012级__ 学号_ 姓名 _ 成绩______专业_计算机科学与技术实验地点__指导教师_实验项目:实验三队列实验性质设计性实验日期:一、实验目的:1、掌握队列及其基本操作的实现。
2、进一步掌握实现数据结构的编程方法。
二、实验内容与要求:1、实验题目一:队列的定义及其相关操作算法的实现要求:编程实现队列的类型定义及其初始化操作、入队操作、出队操作、取队头操作、输出操作等,并对其进行验证。
2、实验题目二:病人看病模拟要求:利用题目一所定义的队列(顺序队或链队)实现病人看病模拟程序,并进行验证给出结果。
三、实验问题描述编写一个程序,反映病人到医院看病,排队看医生的情况。
在病人排队过程中,主要重复两件事:(1)病人到达诊室,将病历本交给护士,拍到等待队列中候诊。
(2)护士从等待队列中取出下一位病人的兵力,该病人进入诊室就诊。
要求模拟病人等待就诊这一过程,程序采用菜单方式,其选项及功能说明如下:(1)排队————输入排队病人的病历号,加入到病人排队队列中。
(2)就诊————病人排队队列中最前面的病人就诊,并将其从队列中删除。
(3)查看排队————从队首到队尾列出所有的排队病人的病历号。
(4)不再排队,余下依次就诊————从队首到队尾列出所有的排队病人的病历号,并退出运行。
(5)下班————退出运行。
四、实验步骤1.实验问题分析此程序采用队列数据结构,存储结构为单链表,采用此种结构一方面可以减少数据复杂程度,增加系统稳定性也利用动态分配内存的方法,便于内存管理,充分利用内存空间2.功能(函数)设计void SeeDoctor(){ int sel,flag=1,find,no;QuType *qu;QNode *p;qu=(QuType *)malloc(sizeof(QuType));qu->front=qu->rear=NULL;}五、实验结果(程序)及分析#include<stdio.h>#include<malloc.h>typedef struct qnode{int data;struct qnode *next;}QNode;typedef struct {QNode *front,*rear;}QuType;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;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;}}}int main(){SeeDoctor();return 0;}六、结论与分析在本次试验中进一步理解队列的基本运算的实现,掌握队列的定义及其基本操作,掌握队列的存储结构及基本运算的实现和掌握队列的操作和应用,差不多也提高使用理论知识指导解决实际问题的能力。
江西师范大学计算机信息工程学院学生实验报告专业_网络工程2班姓名_吴睿_ 学号1308093095 日期__2014.10.303、实验步骤在visual C++ 6.0中进行编程,调试,完成实验。
4、程序及运行结果(或实验数据记录及分析)实验1:linklist delx(linklist head,datatype x){linklist p=head->next,pre=head,q;int i=0;while(p!=NULL&&i==0){if(p->info==x){q=p;p=p->next;pre->next=p;free(q);i=1;}else{pre=p;p=p->next;i=0;}}return head;}linklist reverse(linklist head) {linklist p,q;p=head->next;head->next=NULL;while(p!=NULL){q=p->next;p->next=head->next;head->next=p;p=q;}return head;}linklist insert(linklist head ,datatype x) {linklist p,q;q=head;p=(linklist)malloc(sizeof(node));p->info=x;while(q->next->info<x&&q->next!=NULL){ q=q->next;}p->next=q->next;q->next=p;return head;}:linklist delallx(linklist head,int x) {linklist p=head->next,pre=head,q;while(p!=NULL){if(p->info==x){q=p;p=p->next;pre->next=p;free(q);}else{pre=p;p=p->next;}}return head;}{linklist head,tmp=NULL;linklist head1=L1,head2=L2;head=(linklist)malloc(sizeof(node));head->next=NULL;if (L1->next->info>L2->next->info)//哪个链表第一个节点值小,则把它的头指针作为合并后的头指针{head1 = L2;head2 = L1;}head->next=head1->next;while (head2!= NULL){while ( (head1->next->info < head2->info) && head1->next!=NULL) {head1 = head1->next;}tmp = head2;head2 = head2->next;tmp->next = head1->next;head1->next = tmp;}return head;}{linklist p1,p2,p3,L3,r;L3=r=(linklist)malloc(sizeof(node));L3->next=NULL;p1=L1->next;while(p1!=NULL){ p2=L2->next;while((p2!=NULL)&&(p2->info!=p1->info)) p2=p2->next;if((p2!=NULL)&&(p2->info==p1->info)) { p3=(linklist)malloc(sizeof(node));//L3=L3->next;p3->info=p1->info;r->next=p3;r=p3;}p1=p1->next;}// print(L3);r->next=NULL;return L3;}void partion(linklist head) {linklist p,s,pre;pre=head;p=head->next;while(p){if(p->info%2==0){pre=p;p=p->next;}else{s=p;pre->next=p->next;p=pre->next;s->next=NULL;s->next=head->next;head->next=s;}}}linklist search(linklist head,int k) {int num=0,i=0;linklist p=head;if(head==NULL)return NULL;while(p->next!=NULL){p=p->next;num++;}if(num<k)return NULL;p=head;for(i=0;i<num-k;i++)p=p->next;return p;}。
《数据结构》实验报告实验序号:4 实验项目名称:栈的操作1.#include <iostream>#define MaxSize 100using namespace std;typedef int ElemType;typedef struct{ElemType data[MaxSize];int top;}SqStack;void InitStack(SqStack *st) //初始化栈{st->top=-1;}int StackEmpty(SqStack *st) //判断栈为空{return (st->top==-1);}void Push(SqStack *st,ElemType * x,int k) //元素进栈{int i;for(i=1;i<k;i++){if(st->top==MaxSize-1){printf("栈上溢出!\n");}else{st->top++; //移动栈顶位置st->data[st->top]=x[i-1]; //数组进栈printf("%d\n",st->data[st->top]);}}}void Pop(SqStack *st,ElemType &e,int k) //出栈{int i;for(i=1;i<k;i++){if(st->top==-1){printf("栈下溢出\n");}else{e=st->data[st->top]; //元素出栈printf("%d \n",e);st->top--; //移动栈顶位置}}}int main(){SqStack L;SqStack *st=&L;ElemType e;ElemType num [9]={1,2,3,4,5,6,7,8,9};InitStack(st);printf("入栈元素是:\n");Push(st,num,10);printf("出栈元素是:\n");Pop(st,e,10);return 0;}2.#include<stdio.h>#include<stack> //引入栈using namespace std;int main(void){int temp=1;char ch;stack<char>s;s.push('#');printf("请输入一个算法表达式,以# 结束!\n");ch=getchar();while(ch!='#'&&temp==1){if(ch=='(')s.push(ch);else if(ch==')'){if(s.top()=='#') //右括号多于左括号temp=0;elses.pop();}ch=getchar();}if(s.top()!='#') //左括号多于右括号temp=0;if(temp==0)printf("圆括号匹配错误!\n",temp);else if(temp==1)printf("圆括号匹配正确!\n",temp);return 0;}。
数据结构实验报告数据结构实验报告精选2篇(一)实验目的:1. 熟悉数据结构的基本概念和基本操作;2. 掌握线性表、栈、队列、链表等经典数据结构的实现方法;3. 掌握数据结构在实际问题中的应用。
实验内容:本次实验主要包括以下几个部分:1. 线性表的实现方法,包括顺序表和链表,分别使用数组和链表来实现线性表的基本操作;2. 栈的实现方法,包括顺序栈和链式栈,分别使用数组和链表来实现栈的基本操作;3. 队列的实现方法,包括顺序队列和链式队列,分别使用数组和链表来实现队列的基本操作;4. 链表的实现方法,包括单链表、双链表和循环链表,分别使用指针链、双向链和循环链来实现链表的基本操作;5. 综合应用,使用各种数据结构来解决实际问题,例如使用栈来实现括号匹配、使用队列来实现马铃薯游戏等。
实验步骤及结果:1. 线性表的实现方法:a) 顺序表的基本操作:创建表、插入元素、删除元素、查找元素等;b) 链表的基本操作:插入节点、删除节点、查找节点等;c) 比较顺序表和链表的优缺点,分析适用场景。
结果:通过实验,确认了顺序表适用于频繁查找元素的情况,而链表适用于频繁插入和删除节点的情况。
2. 栈的实现方法:a) 顺序栈的基本操作:进栈、出栈、判空、判满等;b) 链式栈的基本操作:进栈、出栈、判空、判满等。
结果:通过实验,掌握了栈的基本操作,并了解了栈的特性和应用场景,例如括号匹配。
3. 队列的实现方法:a) 顺序队列的基本操作:入队、出队、判空、判满等;b) 链式队列的基本操作:入队、出队、判空、判满等。
结果:通过实验,掌握了队列的基本操作,并了解了队列的特性和应用场景,例如马铃薯游戏。
4. 链表的实现方法:a) 单链表的基本操作:插入节点、删除节点、查找节点等;b) 双链表的基本操作:插入节点、删除节点、查找节点等;c) 循环链表的基本操作:插入节点、删除节点、查找节点等。
结果:通过实验,掌握了链表的基本操作,并了解了链表的特性和应用场景。
《数字逻辑》实验报告
实验序号:3 实验项目名称:逻辑电路的转换与化简
图1.1:“不一致电路”连接图
(4)流程分析:通过列出真值表,我们可以得到该逻辑电路的逻辑表达式,对其进行化简后得到新的逻辑表达式,再根据新的逻辑表达式我们可以设计出相应的
图2.1:裁判器电路未化简连接图
图2.2:裁判器电路化简连接图
)分析电路:图1为L=A—BC+AB—C+ABC—+ABC的接法,图2为L=AB+BC+AC
由图我们可以很明显的看出当我们对逻辑表达式进行化简之后可以一定程度上对逻辑电路设计进行简化,图1使用了八个逻辑门,而图二只使用了四个逻辑门,
图3.1:全加器连接图
的结果可由两个异或门得出,而C可由三个与非门与一个异或(4)电路分析:S
i。
《操作系统》实验报告实验序号:3 实验项目名称:进程管理四、实验结果与数据处理1.进程的创建一(1)实验结果:图1:进程的创建一代码图2:程序运行结果(2)结果分析:运行结果:我们由图可以得知输出结果为bca或者abc的任意排列。
结果分析:我们从进程执行并发的角度来思考,不管输出abc的任意排列都是有可能的。
原因:fork函数的原理是:一个现有进程可以调用fork函数创建一个新进程。
由fork创建的新进程被称为子进程(child process)。
fork函数被调用一次但返回两次。
两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。
在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。
我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
而fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,所以输出abc的排列都是有可能的。
(3)程序修改:1.如果想让子进程先执行,父进程后执行,利用wait()/waitpid()函数怎样修改程序实现。
2.如果让多个进程不并发执行,而是按规定的顺序执行,请利用sleep()函数怎样修改程序实现。
图3:修改后的代码图4:修改后的代码运行结果从代码修改后的运行结果和网上查阅的资料我们可以知道wait()/waitpid()和sleep()函数都可以控制进程执行的先后顺序,而我们也可以深入了解一下wait()和waitpid()的区别:a. wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接收到了一个指定的信号为止。
如果该父进程没有子进程或者它的子进程已经结束,则wait()函数就会立即返回。
b. waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程(它可以指定需要等待终止的子进程),它还有若干选项,如可提供一个非阻塞版本的wait()功能,也能支持作业控制。
目录第一部分预备知识 (1)预备知识 (1)预备知识实验 (2)第二部分基础实验 (4)实验1 线性表的基本操作 (4)实验2 链表的基本操作 (9)实验3 栈的基本操作 (15)实验4 队列的基本操作 (22)实验5 数组的基本操作 (32)实验6 字符串的基本操作 (36)实验7 二叉树的基本操作 (41)实验8 树的遍历和哈夫曼树 (46)实验9 图的基本操作 (53)实验10 排序 (59)实验11 查找 (64)第三部分课程设计实验 (69)实验1 航空客运订票系统 (69)实验2 汉诺塔游戏程序 (75)实验3 全屏幕编辑程序设计 (79)实验4 旅游路线安排模拟系统 (90)实验6 最小生成树kruskal算法 (93)第一部分预备知识预备知识例1.1#include <stdio.h>int sumabc(int a, int b, int c) /* 求三个整数之和*/{ int s;a=b+c;s=a+b+c;return s;}void displayLine(void){ printf(”----------------------\n“);}void main( ){ int x,y, z ,sabc;x=y=z=8;display(); /* 画一条线*/printf(“\n sum=%d”,sumabc(x,y,z)); /* 在输出语句中直接调用函数sumabc( ) */ printf(“\n %6d%6d%6d”,x,y,z);display();/* 画一条线*/x=2; y=4; z=6;sabc =sumabc(x, y, z); /* 在赋值语句中调用函数sumabc( ) */printf(“\n “ sum=%d”, sabc);printf(“\n %6d%6d%6d”,x,y,z);display();/* 画一条线*/}例1.2int sumabc(int *a, int b, int c){int s;*a=b+c;s=*a+b+c;return s;}预备知识实验int main(){ //在main函数中调用上述声明的函数int n; //记录个数STUDENT stu[MAXSIZE;// 顺序存储结构,方法一静态一维数组。
《数据结构》实验报告实验序号:2 实验项目名称:顺序表的操作学号姓名专业、班级实验地点实1#514 指导教师林仙丽实验时间2013-10-18一、实验目的及要求1.掌握线性表的顺序存储类型;2.熟练掌握顺序表的基本操作和具体的函数实现。
二、实验设备(环境)及要求微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境。
三、实验内容与步骤1.设A、B均为用数组实现的List类型的顺序表,试设计一个函数Alternate (A,B),从表A中第1个元素开始,交替地用表A和表B中元素组成一个新表。
运行结果截图:运行结果截图:四、分析与讨论刚开始敲主函数时,由于一直没有给结构体指针*m初始化,导致运行一直出错,找了一个多小时的bug,还是没找着。
最后在大神杨靖钰的帮助下,先定义了一个结构体list,再用指针m指向list,即m=*list。
之后一切都变简单了。
五、教师评语成绩签名:日期:附源程序清单:1.#include<stdio.h>#include<stdlib.h>#define LIST_INIT_SIZE 10#define LISTINCREMENT 5typedef int ElemType;typedef struct{ElemType *elem;int length ;int ListSize;} sqlist;int InitList_sq(sqlist *l) /*initial the list l*/{l->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));if (!l->elem){printf("无法分配空间!");return 1;}else{l->length=0;l->ListSize=LIST_INIT_SIZE;printf("ok\n");return 0;}}void Alternate(sqlist *A,sqlist*B){ElemType i;sqlist list;sqlist *C;C=&list;InitList_sq(C);C->length=A->length+B->length;while(i){if(C->length>=C->ListSize){ElemType *newbase;newbase=( ElemType *)realloc(C->elem, (C->ListSize+LISTINCREMENT)*sizeof(ElemType));C->elem=newbase;C->ListSize+=LISTINCREMENT;}else break;}for(i=0;i<C->length;i++){C->elem[2*i]=A->elem[i];C->elem[2*i+1]=B->elem[i];}for(i=0;i<C->length;i++)printf("%d ",C->elem[i]);}void main(){ElemType i;sqlist list1,list2,*A,*B;A=&list1;B=&list2;InitList_sq(A);InitList_sq(B);printf("请输入A指向的5个整数:\n");for(i=0;i<5;i++)scanf("%d",&A->elem[i]);A->length=i;printf("请输入B指向的5个整数:\n");for(i=0;i<5;i++)scanf("%d",&B->elem[i]);B->length=i;Alternate(A,B);printf("\n");}2.#include<stdio.h>#include<stdlib.h># define LIST_INIT_SIZE 10 //线性表存储空间的初始分配量# define LISTINCREMENT 5 //线性表存储空间的分配增量typedef int ElemType;typedef struct{int *elem;int length ; //当前长度int ListSize; //当前分配的存储容量} sqlist;int InitList_sq(sqlist *l) /*initial the list l*/{l->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));if (!l->elem){printf("无法分配空间!");return 1;}else{l->length=0;l->ListSize=LIST_INIT_SIZE;printf("ok\n");return 0;}}int ListInsert_Sq(sqlist *L,int i, int e){int *q,*p;if(i<1 || i>L->length+1)return 1;if(L->length>=L->ListSize){int *newbase;newbase=( ElemType *)realloc(L->elem, (L->ListSize+LISTINCREMENT)*sizeof(ElemType));if(!newbase)return 1;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 0;}void main(){int i,j,k,b;int a1[LIST_INIT_SIZE],a2[100];sqlist list,*m;m=&list;b=InitList_sq(m);printf("请输入10个整数:\n");for(j=0;j<LIST_INIT_SIZE;j++)scanf("%d",&m->elem[j]);m->length=j;printf("请输入i和k的值:\n");scanf("%d%d",&i,&k);printf("请输入要插入%d个数:\n",k);for(j=0;j<k;j++)scanf("%d",&a2[j]);for(j=0;j<k;j++){b=ListInsert_Sq(m,i+j,a2[j]);}for(j=0;j<m->length;j++)printf("%d ",m->elem[j]);printf("\n");}。
一、实验名称:数据结构实验实训二、实验时间:2023年10月25日三、实验地点:计算机实验室四、实验目的:1. 理解并掌握数据结构的基本概念和常用算法;2. 学会使用C++语言实现数据结构的操作;3. 提高编程能力和问题解决能力;4. 加深对数据结构在实际应用中的理解。
五、实验内容:1. 实验一:线性表(1)实验内容:实现线性表的基本操作,如插入、删除、查找、排序等。
(2)实验步骤:a. 定义线性表的数据结构;b. 实现线性表的插入、删除、查找、排序等操作;c. 编写测试程序,验证实验结果。
2. 实验二:栈与队列(1)实验内容:实现栈和队列的基本操作,并分析其时间复杂度和空间复杂度。
(2)实验步骤:a. 定义栈和队列的数据结构;b. 实现栈和队列的入栈、出栈、入队、出队等操作;c. 分析栈和队列的时间复杂度和空间复杂度;d. 编写测试程序,验证实验结果。
3. 实验三:链表(1)实验内容:实现链表的基本操作,如插入、删除、查找、排序等。
(2)实验步骤:a. 定义链表的数据结构;b. 实现链表的插入、删除、查找、排序等操作;c. 编写测试程序,验证实验结果。
4. 实验四:树与二叉树(1)实验内容:实现二叉树的基本操作,如插入、删除、查找、遍历等。
(2)实验步骤:a. 定义二叉树的数据结构;b. 实现二叉树的插入、删除、查找、遍历等操作;c. 编写测试程序,验证实验结果。
5. 实验五:图(1)实验内容:实现图的基本操作,如图的创建、添加边、查找路径等。
(2)实验步骤:a. 定义图的数据结构;b. 实现图的创建、添加边、查找路径等操作;c. 编写测试程序,验证实验结果。
六、实验心得:1. 通过本次实验,我对数据结构的基本概念和常用算法有了更深入的理解,为今后的学习和工作打下了坚实的基础。
2. 在实验过程中,我学会了使用C++语言实现数据结构的操作,提高了自己的编程能力。
3. 通过对数据结构在实际应用中的分析,我认识到数据结构在计算机科学中的重要地位,为今后的职业发展指明了方向。
2020年数据结构实验3精品版《数据结构》实验报告void main(){int n,i,a;//n为节点数,i为插入元素的位置,a为插入元素的值LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);CreateList_L ( L, n ); //初始化链表节点个数为nprintf("请输入要插入的位置:");scanf("%d",&i);printf("请输入要插入的值:");scanf("%d",&a);ListInsert_L(L,i,a); //在第i个位置插入元素aShowList_L(L); //输出链表L中的所有元素}运行以上程序,根据要求完成下列题目:1.参考P30页中的例题2.10实现ListDelete_L函数,并在主函数中测试;2.编写一个函数计算值域为x的结点个数,并在主函数中测试;以下题目任选一题:3.编写一个删除链表中值为x的结点的直接前趋结点的算法,若有多个值为x的结点,则删除第一个x的直接前趋结点;4.改写CreateList_L函数,使得链表创建时为非降序排列;5.改写ListInsert_L函数,忽略位置参数,在上述非降序排列链表中插入一个元素,使得链表依然保持非降序;附源程序清单:1# include <stdlib.h># include <stdio.h># define ERROR 1# define OK 0# define OVERFLOW 1typedef int ElemType;//给int一个别名ElemType typedef int Status;//给int一个别名Status typedef struct LNode{ElemType data;struct LNode *next;} LNode, *LinkList;void CreateList_L ( LinkList &L, int n ){// 输入 n 个数据元素的值,建立带头结点的单链表 Lprintf("请输入插入链表的节点值:\n");LinkList p;int i;L = ( LinkList ) malloc ( sizeof ( LNode ) );L->next = NULL; // 先建立一个带头结点的空链表for ( i = n; i > 0; i-- ){p = ( LinkList ) malloc ( sizeof ( LNode ) );scanf ("%d" ,&p->data );p->next = L->next;L->next = p;}}Status ListInsert_L ( LinkList &L, int i, ElemType e ){// 带头结点的单链表L中第 i 个位置之前插入元素 eLinkList p,s;int j; //j为计数器p = L; //p指向L的头节点j = 0;while ( p && j<i-1 ) //顺指针向后查,直到p指向第i个元素之前{p = p->next; ++j;}if ( ! p || j >i-1 )return ERROR;s = ( LinkList ) malloc ( sizeof ( LNode ) ); // 生成新结点s->data = e; // 使新结点数据域的值为 es->next = p->next; // 将新结点插入到单链表 L 中p->next = s; // 修改第 i-1 个结点指针return OK;}void ShowList_L ( LinkList L ){// 输出链表L中的所有元素LinkList p;printf("链表中的元素为:\n");p=L->next; //跳过头结点while(p){printf(" %d ",p->data);p=p->next;}}Status ListDelete_L(LinkList &L,int i,ElemType &e) {LinkList p,q;int j;p=L;j=0;while(p->next&&j<i-1){p=p->next;++j;}if(!(p->next)||j>i-1)return ERROR;q=p->next;p->next=q->next;e=q->data; free(q);return OK;}void main(){int n,i,a,x;//n为节点数,i为插入元素的位置,a为插入元素的值LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);CreateList_L ( L, n ); //初始化链表节点个数为nprintf("请输入要插入的位置:");scanf("%d",&i);printf("请输入要插入的值:");scanf("%d",&a);ListInsert_L(L,i,a); //在第i个位置插入元素aShowList_L(L); //输出链表L中的所有元素printf("请输入要删除的位置:");scanf("%d",&x);ListDelete_L(L,x,i);ShowList_L(L);}2 # include <stdlib.h># include <stdio.h># define ERROR 1# define OK 0# define OVERFLOW 1typedef int ElemType;//给int一个别名ElemTypetypedef int Status;//给int一个别名Statustypedef struct LNode{ElemType data;struct LNode *next;} LNode, *LinkList;void CreateList_L ( LinkList &L, int n ){// 输入 n 个数据元素的值,建立带头结点的单链表 Lprintf("请输入插入链表的节点值:\n");LinkList p;int i;L = ( LinkList ) malloc ( sizeof ( LNode ) );L->next = NULL; // 先建立一个带头结点的空链表for ( i = n; i > 0; i-- ){p = ( LinkList ) malloc ( sizeof ( LNode ) );scanf ("%d" ,&p->data );p->next = L->next;L->next = p;}}Status ListInsert_L ( LinkList &L, int i, ElemType e ){// 带头结点的单链表L中第 i 个位置之前插入元素 eLinkList p,s;int j; //j为计数器p = L; //p指向L的头节点j = 0;while ( p && j<i-1 ) //顺指针向后查,直到p指向第i个元素之前{p = p->next; ++j;}if ( ! p || j >i-1 )return ERROR;s = ( LinkList ) malloc ( sizeof ( LNode ) ); // 生成新结点s->data = e; // 使新结点数据域的值为 es->next = p->next; // 将新结点插入到单链表 L 中p->next = s; // 修改第 i-1 个结点指针return OK;}void ShowList_L ( LinkList L ){// 输出链表L中的所有元素LinkList p;printf("链表中的元素为:\n");p=L->next; //跳过头结点while(p){printf(" %d ",p->data);p=p->next;}}Status ListDelete_L(LinkList &L,int i,ElemType &e) {LinkList p,q;int j;p=L;j=0;while(p->next&&j<i-1){p=p->next;++j;}if(!(p->next)||j>i-1)return ERROR;q=p->next;p->next=q->next;e=q->data; free(q);return OK;}Status Mycompara_L(LinkList &L,ElemType y ){LinkList p;int i=0;p=L->next;while(p){if(p->data==y) i++;p=p->next;}printf("链表中一共有%d个要查找的结点:\n",i);return 0;}void main(){int n,i,a;//n为节点数,i为插入元素的位置,a为插入元素的值LinkList L;ElemType x;printf("请输入链式表的节点数:");scanf("%d",&n);CreateList_L ( L, n ); //初始化链表节点个数为n printf("请输入需要查找的节点值:\n");scanf("%d",&x);Mycompara_L(L,x);}p=L;j=0;while(p->next&&j<i-1){p=p->next;++j;}if(!(p->next)||j>i-1)return ERROR;q=p->next;p->next=q->next;e=q->data; free(q);return OK;}Status Mycompara_L(LinkList &L,ElemType y ){LinkList p;int i=0;p=L->next;while(p){if(p->data==y) i++;p=p->next;}printf("链表中一共有%d个要查找的结点:\n",i);return 0;}Status mycompara_delete(LinkList &L){LinkList p,q,s;p=L->next;while(p&&p->next){s=p;q=p->next;while (q){if(q->data==p->data){ s->next=q->next;free(q);q=s->next;}else{ s=q;q=q->next;}}p=p->next;}return 0;}void main(){int n;//n为节点数,i为插入元素的位置,a为插入元素的值LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);CreateList_L ( L, n ); //初始化链表节点个数为nmycompara_delete(L);ShowList_L(L);}。
数据结构实验三以下是为您起草的一份关于“数据结构实验三”的协议:合同主体:甲方:____________________________乙方:____________________________合同标的:1、本次协议的标的为“数据结构实验三”项目的相关合作事宜。
2、甲方和乙方将共同参与并完成“数据结构实验三”的任务,包括但不限于设计数据结构、编写代码、进行测试和优化等工作。
权利义务:11 甲方的权利义务111 甲方有权按照约定的分工和计划参与“数据结构实验三”的工作。
112 甲方有义务按时、按质量要求完成所承担的任务部分。
113 甲方应保守在实验过程中知悉的相关技术和业务秘密。
12 乙方的权利义务121 乙方有权对甲方的工作进行监督和检查。
122 乙方有义务向甲方提供必要的技术支持和协助。
123 乙方应按照约定的时间和方式与甲方进行沟通和协调。
违约责任:1、若甲方未能按时、按质量完成任务,应承担相应的责任,包括但不限于重新完成任务、采取补救措施,并可能承担因延误给乙方造成的损失。
2、若乙方未按约定提供技术支持和协助,导致实验任务受到影响,乙方应负责弥补损失,并采取措施改进。
3、若双方违反保密义务,泄露相关技术和业务秘密,应承担法律责任,并赔偿对方因此遭受的损失。
争议解决方式:1、本协议在履行过程中如发生争议,双方应首先友好协商解决。
2、若协商不成,任何一方均有权向有管辖权的人民法院提起诉讼。
本协议自双方签字(或盖章)之日起生效,有效期至“数据结构实验三”项目完成并验收合格之日止。
本协议一式两份,双方各执一份,具有同等法律效力。
《数据结构》实验报告实验序号:3 实验项目名称:链式表的操作int n,i,a;//n为节点数,i为插入元素的位置,a为插入元素的值LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);CreateList_L ( L, n ); //初始化链表节点个数为nprintf("请输入要插入的位置:");scanf("%d",&i);printf("请输入要插入的值:");scanf("%d",&a);ListInsert_L(L,i,a); //在第i个位置插入元素aShowList_L(L); //输出链表L中的所有元素}运行以上程序,根据要求完成下列题目:1.参考P30页中的例题2.10实现ListDelete_L函数,并在主函数中测试;2.编写一个函数计算值为3的结点个数,并在主函数中测试;以下题目任选一题:3.编写一个删除链表中值为3的结点的直接前趋结点的算法,若有多个值为3的结点,则删除第一个值为3的直接前趋结点;4.改写CreateList_L函数,使得链表创建时为非降序排列;5.改写ListInsert_L函数,忽略位置参数,在上述非降序排列链表中插入一个元素,使得链表依然保持非降序;6.写一个对单循环链表进行逆序遍历(打印每个结点的值)的算法;7.编写一个函数,将单链表中值重复的结点删除,使所得的结果表中各结点值双联表牛13,双链表牛13,牛13第一张图第一个数据是59,截图接没了;8. 改写CreateList_L函数,采用尾插法创建带有头节点的单链表。
四、实验结果与数据处理详细记录程序在调试过程中出现的问题及解决方法。
记录程序执行的结果(贴图)。
五、分析与讨论对上机实践结果进行分析,上机的心得体会。
六、教师评语成绩附源程序清单:1只写改的和后添加的代码Status ListDelete_L(LinkList &L, int i,ElemType &e){LinkList p,q;int j;p=L;j=0;while((p->next)&&(j<i-1)){p=p->next;++j;}if(!(p=p->next)||j>i-1)return ERROR;q=p->next;p->next=q->next;e=q->data;free(q);return OK;}void main(){int n,i,a;//n为节点数,i为插入元素的位置,a删除相应元素后的显示质LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);CreateList_L ( L, n ); //初始化链表节点个数为nprintf("请输入要删除的位置:");scanf("%d",&i);ListDelete_L(L,--i,a); //在第i个位置删除元素ShowList_L(L); //输出链表L中的所有元素}2# include <stdlib.h># include <stdio.h># define ERROR 1# define OK 0# define OVERFLOW 1typedef int ElemType;//给int一个别名ElemTypetypedef int Status;//给int一个别名Statustypedef struct LNode{ElemType data;struct LNode *next;} LNode, *LinkList;void CreateList_L ( LinkList &L, int n ){// 输入n 个数据元素的值,建立带头结点的单链表Lprintf("请输入插入链表的节点值:\n");LinkList p;int i;L = ( LinkList ) malloc ( sizeof ( LNode ) );L->next = NULL; // 先建立一个带头结点的空链表for ( i = n; i > 0; i-- ){p = ( LinkList ) malloc ( sizeof ( LNode ) );scanf ("%d" ,&p->data );p->next = L->next;L->next = p;}}Status ListInsert_L ( LinkList &L, int i, ElemType e ){// 带头结点的单链表L中第i 个位置之前插入元素eLinkList p,s;int j; //j为计数器p = L; //p指向L的头节点j = 0;while ( p && j<i-1 ) //顺指针向后查,直到p指向第i个元素之前{p = p->next; ++j;}if ( ! p || j >i-1 )return ERROR;s = ( LinkList ) malloc ( sizeof ( LNode ) ); // 生成新结点s->data = e; // 使新结点数据域的值为es->next = p->next; // 将新结点插入到单链表L 中p->next = s; // 修改第i-1 个结点指针return OK;}void ShowList_L ( LinkList L ){// 输出链表L中的所有元素LinkList p;printf("链表中的元素为:\n");p=L->next; //跳过头结点while(p){printf(" %d ",p->data);p=p->next;}}int function(LinkList &L,int i){LinkList p,q;p=L;int j=0;while(p){if(p->data==i)j++;p=p->next;}return j;}void main(){int n,i,a;//n为节点数,i为插入元素的位置,a为查找后总计数LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);CreateList_L ( L, n ); //初始化链表节点个数为nprintf("输入要查找的元素\n");scanf("%d",&i);a=function(L,i);printf("%d\n",a);}7#include<stdio.h>#include<stdlib.h>#define ERROR 0#define OK 1#define VERFLOW 1int a[100]={0};typedef int ElemType;typedef int Status;typedef struct LNode{ElemType data;struct LNode *pre,*next;}LNode,*LinkList;void createlist(LinkList &L,int n){printf("输入插入链表的值\n");LinkList p,q;int i;L=(LinkList)malloc(sizeof(LNode));q=L;L->next=NULL;L->pre=NULL;for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);q->next=p;p->pre=q;q=p;}q->next=NULL;}Status ListDelete_L(LinkList &L, int c,int n)//删除相同的值的位置,c是要删除的数字{LinkList p;int j,k;p=L->next;for(j=0;j<n;j++){k=p->data;if(k==c)break;p=p->next;}p->pre->next=p->next;p->next->pre=p->pre;free(p);return OK;}void find(LinkList &L,int n)//发现链表中重复数字的函数用全局变量数组a记录出现次数,a 【i】中i为记录重复数字{LinkList p;p=L->next;int i,v,j;for(i=0;i<n;i++){v=p->data;for(j=0;j<100;j++){if(v==j){a[j]=a[j]+1;}}p=p->next;}}void chazhao(LinkList &L,int x,int n,int b)//b是链表中多余的数字,n是链表长度,x是出现此数,chazhao是进行删除操作的主函数{int j;LinkList p;p=L->next;for(j=0;j<(x-1);j++){ListDelete_L(L, b, n);//b是需要杀出的节点}}void start(LinkList &L,int n){//进行查找删除的主函数int i,x,b;for(i=0;i<100;i++){if(a[i]>=2){x=a[i];b=i;chazhao(L,x,n,b);}}}void ShowList_L ( LinkList L ){// 输出链表L中的所有元素LinkList p;printf("链表中的元素为:\n");p=L->next; //跳过头结点while(p){printf(" %d ",p->data);p=p->next;}}void main(){int n;LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);createlist ( L, n );find (L,n);start(L,n);ShowList_L ( L );}8void CreateList_L ( LinkList &L, int n ){// 输入n 个数据元素的值,建立带头结点的单链表L printf("请输入插入链表的节点值:\n");LinkList p,r;int i;L = ( LinkList ) malloc ( sizeof ( LNode ) );r=L;for ( i = 0; i < n ; i++ ){p = ( LinkList ) malloc ( sizeof ( LNode ) ); //尾插法:新生成节点p储存链表的元素,然后让他的前一个节点(当前链表的尾节点)指向他;头插法:新生成借点储存当前链表元素,然后让当前链表的头结点指向新生成节点scanf ("%d" ,&p->data ); // p->next=l->next;新生成节点指向链表的下一个节点r->next=p; // l->next=p;r=p;}r->next=NULL;}。