数据结构实验报告5(电大)
数据结构实验五实验报告
数据结构实验报告实验五图子系统实验题目:图的遍历问题专业班级:网络工程 1002班组长:王星(30)组员:郭坤铭(43)张磊(44)2012年 5月 18日实验报告实验类型__综合__实验室_软件实验室二__一、实验题目图的遍历问题二、实验目的和要求1、掌握图的存储思想及其存储实现2、掌握图的深度、广度优先遍历算法思想及其程序实现3、掌握图的常见应用算法的思想及其程序实现三、需求分析本演示程序用c++6.0编写,完成用户用键盘输入以下结点数据:太原、成都、北京、上海、天津、大连、河北。
(1)建立一个有向图或无向图(自定)的邻接表并输出该邻接表。
(2)在图的邻接表的基础上计算各顶点的度,并输出。
(3)以有向图的邻接表为基础实现输出它的拓扑排序序列。
(4)采用邻接表存储实现无向图的深度优先遍历。
(5)采用邻接表存储实现无向图的广度优先遍历。
(6)采用邻接矩阵存储实现无向图的最小生成树的 PRIM 算法。
最后,在主函数中设计一个简单的菜单,分别调试上述算法。
四、概要设计为了实现上述程序功能,需要定义如下内容基本数据类型定义如下:typedef struct node{ //边表结点int adj; //边表结点数据域struct node *next;}node;typedef struct vnode //顶点表结点{ char name[20];node *fnext;}vnode,AList[20];typedef struct{ AList List; //邻接表int v,e; //顶点树和边数}*Graph;Graph CreatDG(){ } //建立无向邻接表Graph CreatAG(){ } //有向邻接图void Print(Graph G){} //输出图的邻接表void CreateAN(AGraph *G1){} //构造邻接矩阵结构的图G void Du(Graph G){} //输出各顶点的度数void DFSTravel(Graph G){} //深度优先遍历void BFSTravel(Graph G){} //广度优先遍历五、详细设计#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct node{//边表结点int adj;//边表结点数据域struct node *next;}node;typedef struct vnode{//顶点表结点char name[20];node *fnext;}vnode,AList[20];typedef struct{AList List;//邻接表int v,e;//顶点树和边数}*Graph;//建立无向邻接表Graph CreatDG(){Graph G;int i,j,k;node *s;G=malloc(20*sizeof(vnode));printf("请输入图的顶点数和边数(空格隔开):");scanf("%d%d",&G->v,&G->e);//读入顶点数和边数for(i=0;i<G->v;i++){printf("请输入图中第%d元素:",i+1);scanf("%s",G->List[i].name);//读入顶点信息G->List[i].fnext=NULL;//边表置为空表}for(k=0;k<G->e;k++){printf("请请输入第%d条边的两顶点序号(空格隔开):",k+1);scanf("%d%d",&i,&j);//读入边(Vi,Vj)的顶点对序号;s=(node *)malloc(sizeof(node));//生成边表结点s->adj=j;s->next=G->List[i].fnext;G->List[i].fnext=s;//将新结点*s插入顶点Vi的边表头部s=(node *)malloc(sizeof(node));s->adj=i;//邻接点序号为is->next=G->List[j].fnext;G->List[j].fnext=s;// 将新结点*s插入顶点Vj的边表头部}return G;}//有向邻接图Graph CreatAG(){Graph G;int i,j,k;node *q;G=malloc(20*sizeof(vnode));printf("请输入图的顶点数和边数【空格隔开】:");scanf("%d%d",&G->v,&G->e);for (i=0;i<G->v;i++){printf("请输入图中第%d元素:",i+1);scanf("%s",&G->List[i].name); //读入顶点信息G->List[i].fnext=NULL;}for (k=0;k<G->e;k++){printf("请请输入第%d边的两顶点序号【空格隔开】:",k+1);scanf("%d%d",&i,&j);q=(node *)malloc(sizeof(node)); //生成新边表结点sq->adj=j; //邻接点序号为jq->next=G->List[i].fnext;G->List[i].fnext=q;}return G;}//输出图的邻接表void Print(Graph G){int i;node *p;printf("\t=======邻接表========\n");for(i=0;i<G->v;i++){p=G->List[i].fnext;printf("%d | %3s",i,G->List[i].name);while(p){printf("->%3s",G->List[p->adj].name);printf("->%d",p->adj);p=p->next;}printf("\n");}}typedef struct {char vex[20];}Lists[20];typedef struct{Lists l;int edge[20][20];//邻接矩阵int v1,e1;//顶点数和弧数}AGraph;typedef struct{int data; /* 某顶点与已构造好的部分生成树的顶点之间权值最小的顶点 */int lowcost; /* 某顶点与已构造好的部分生成树的顶点之间的最小权值 */}ClosEdge[20]; /* 用普里姆算法求最小生成树时的辅助数组 */ void CreateAN(AGraph *G1){/* 构造邻接矩阵结构的图G */int i,j,k,w;printf("请输入图的顶点数和边数(空格隔开):");scanf("%d%d",&G1->v1,&G1->e1);//读入顶点数和边数for(i=1;i<=G1->v1;i++){printf("请输入图%d号元素:",i);scanf("%s",&G1->l[i].vex);//读入顶点信息}for(i=1;i<=G1->v1;i++)//初始化邻接矩阵for(j=1;j<=G1->v1;j++)G1->edge[i][j] = 9;for(k=1;k<=G1->e1;k++){printf("请输入两顶点及边的权值(空格隔开):");scanf("%d%d%d",&i,&j,&w);G1->edge[i][j]=w;G1->edge[j][i]=w;}}void PrintAN(AGraph *G1){int i,j;printf("\t=======邻接矩阵========\n");for(i=1;i<=G1->v1;i++){for(j=1;j<=G1->v1;j++)printf("%3d",G1->edge[i][j]);printf("\n");}}//输出各顶点的度数void Du(Graph G){int i,j;printf("\n<----各点度数---->\n");for(i=0;i<G->v;i++){p=G->List[i].fnext;printf("顶点%2s的度为:",G->List[i].name);j=0;while(p){j++;p=p->next;}printf("%d\n",j);}}//栈typedef struct stack{int x;struct stack *next;}stack;int push(stack *s,int i){stack *p;p=(stack *)malloc(sizeof(stack));p->x=i;p->next=s->next;s->next=p;return 1;}int pop(stack *s,int j){stack *p=s->next;//保存栈顶指针j=p->x;s->next=p->next; //将栈顶元素摘下free(p);//释放栈顶空间return j;}//拓扑排序void Topo(Graph G,stack *s){int i,k, count;int j=0;int indegree[20]={0};for(i=0;i<G->v;i++){p=G->List[i].fnext;;while(p!=NULL){indegree[p->adj]++;p=p->next;}}for(i=0;i<G->v;i++)if(indegree[i]==0)push(s,i);count=0;while(s->next!=NULL){i=pop(s,j);printf("%2s ",G->List[i].name);++count;for(p=G->List[i].fnext;p!=NULL;p=p->next){ k=p->adj;if(!(--indegree[k]))push(s,k);}}if(count<G->v) printf("有回路!");}void DFS(Graph G,int i,int flag[]){node *p;printf("%2s ",G->List[i].name);flag[i]=1;p=G->List[i].fnext;while(p){if(!flag[p->adj])DFS(G,p->adj,flag);p=p->next;}}//深度优先遍历void DFSTravel(Graph G){int i;int flag[20];//标志数组for(i=0;i<G->v;i++)flag[i]=0;for(i=0;i<G->v;i++)if(!flag[i])DFS(G,i,flag);}//建立队列typedef struct{int *elem;int front, rear;}*Queue;//队列初始化void InitQueue(Queue Q){Q->elem=(int *)malloc(20*sizeof(int));if(!Q->elem)exit(0);Q->front=Q->rear=0;}//入队void Enter(Queue Q, int e){if((Q->rear + 1)%20!= Q->front)Q->elem[Q->rear ]=e;elseprintf("队列满!\n");Q->rear=(Q->rear+1)%20;}//出队void Leave(Queue Q, int e){if(Q->rear != Q->front)e=Q->elem[Q->front];elseprintf("队列空!\n");Q->front=(Q->front+1)%20;}//广度优先遍历void BFSTravel(Graph G){Queue Q;node *p;int i,j=0;int flag[20];//标志数组Q=malloc(sizeof(20));InitQueue(Q);for(i=0;i<G->v;i++)flag[i]=0;for(i=0;i<G->v;i++)if(flag[i]==0){flag[i]=1;printf("%2s",G->List[i].name);Enter(Q,i);while(Q->front!=Q->rear){Leave(Q,j);//队头元素出队并置为jp=G->List[j].fnext;while(p!=NULL){if(flag[p->adj]==0){printf("%2s ",G->List[p->adj].name);flag[p->adj]=1;Enter(Q,p->adj);}p=p->next;}}}}int minimum(ClosEdge cl,int vnum){int i;int w,p;w=1000;for(i=1;i<=vnum;i++)if(cl[i].lowcost!=0&&cl[i].lowcost<w){w=cl[i].lowcost;p=i;}return p;}void Prim(AGraph *G1,int u){ClosEdge closedge;int i,j,k;for(j=1;j<=G1->v1;j++) /* 辅助数组初始化 */if(j!=u){closedge[j].data=u;closedge[j].lowcost=G1->edge[u][j];}closedge[u].lowcost=0; /* 初始,U={u} */for(i=1;i<G1->v1;i++){k=minimum(closedge,G1->v1); /* 求出生成树的下一个顶点*/printf("%d-----%d\n",closedge[k].data,k); /* 输出生成树的边 */closedge[k].lowcost=0; /* 第k顶点并入U集 */for(j=1;j<=G1->v1;j++) /* 新顶点并入U后,修改辅助数组*/if(G1->edge[k][j]<closedge[j].lowcost){closedge[j].data=k;closedge[j].lowcost=G1->edge[k][j];}}}//菜单列表void menu(){printf("\t**********************图的遍历问题**********************\n");printf("\t\t------- 1.建立无向邻接图---------\n");printf("\t\t------- 2.建立有向邻接图---------\n");printf("\t\t------- 3.建立无向邻接矩阵---------\n");printf("\t\t------- 4.输出各顶点的度---------\n");printf("\t\t------- 5.拓扑排序---------\n");printf("\t\t------- 6.深度优先遍历---------\n");printf("\t\t------- 7.广度优先遍历---------\n");printf("\t\t------- 8.prim算法生成最小生成树---------\n");printf("\t\t------- 9-退出---------\n");printf("\t********************************************** **********\n");}//主函数void main(){Graph G;AGraph G1;int choice,u;stack *s=(stack *)malloc(sizeof(stack));s->next =NULL;while(1){menu();printf("请输入选择:");scanf("%d",&choice);switch(choice){case1:G=CreatDG();Print(G);printf("\n\n");break;case2:G=CreatAG();Print(G);printf("\n\n");break;case3:CreateAN(&G1);PrintAN(&G1);printf("\n\n");break; case4:Du(G);printf("\n\n");break;case5:printf("拓扑排序:");Topo(G,s);printf("\n\n");break;case6:printf("深度优先遍历:");DFSTravel(G);printf("\n\n");break;case7:printf("广度优先遍历:");BFSTravel(G);printf("\n\n");break;case 8:printf("请输入起点序号:");scanf("%d",&u);printf("Prim算法:\n");Prim(&G1,u);printf("\n");break;case 9: exit(0);default: printf("输入错误,请重新输入:\n\n ");}}}六、使用说明1、程序名为实验5.exe,运行坏境为DOS.程序执行后显示如图所示:2、建立无向邻接图3、输出各顶点的度4、进行深度优先遍历5、进行广度优先遍历6、建立有向邻接图7、拓扑排序8、建立无向邻接矩阵9、prim算法生成最小生成树七、实验总结本次实验对我们来说有不小的难度,花费了很长的时间,在大家的商量讨论和共同努力下,最终完成了实验的内容,组长在此过程中很认真负责,使组员一步一步前进。
数据结构实验报告
数据结构实验报告数据结构实验报告1-引言本实验旨在深入理解数据结构的基本知识,并通过实践掌握相关算法和数据结构的应用。
本报告详细描述了实验的背景、目的、实验环境、实验内容和实验结果分析等内容。
2-实验背景介绍数据结构的概念和作用,解释为什么数据结构在计算机科学中至关重要。
同时,介绍本次实验所涉及的具体数据结构和算法,如数组、链表、栈、队列、二叉树等。
3-实验目的明确本次实验的目标,如掌握数据结构的基本操作,理解不同数据结构的适用场景,评估不同算法的时间和空间复杂度等。
4-实验环境描述实验所使用的软硬件环境,包括计算机配置、操作系统、编程语言和相关的开发工具等。
5-实验内容详细描述实验的具体步骤和要求,包括以下几个部分:5-1 数据结构的创建和初始化:例如,创建一个数组或链表,并初始化数据。
5-2 数据结构的插入和删除操作:例如,在数组中插入一个元素或删除一个元素。
5-3 数据结构的遍历和搜索:例如,遍历树的节点或搜索链表中指定的元素。
5-4 数据结构的排序和查找:例如,对数组进行排序或在有序链表中查找指定元素。
5-5 实验的额外要求:例如,优化算法的实现、分析不同数据结构的性能等。
6-实验结果分析对实验的结果进行详细的分析和解释,包括各个数据结构和算法的性能比较、时间复杂度和空间复杂度的评估等。
7-结论总结本次实验的主要内容和收获,归纳实验结果,并对实验过程中遇到的问题和不足进行反思和改进。
附件:随报告一同提交的附件包括:源代码、实验数据集等相关文件。
法律名词及注释:1-版权:指作品的创作权、发表权和署名权等综合权利。
2-侵权:指未经权利人允许,在未向权利人支付报酬的情况下,使用受版权保护的作品的行为。
3-知识产权:包括著作权、商标权、专利权等,是指人们在创造性劳动中创造出的精神财富所享有的权利。
数据结构实验报告_实验报告_
数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。
数据结构实验报告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一.实验内容:实现哈夫曼编码的生成算法。
数据结构实验报告实验5
数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,如链表、栈、队列、树和图等,并通过实际编程实现,提高对数据结构的操作和应用能力。
同时,培养解决实际问题的思维和编程能力,提高代码的可读性、可维护性和效率。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、链表的基本操作创建链表插入节点删除节点遍历链表2、栈的实现与应用用数组实现栈用链表实现栈栈的应用:括号匹配3、队列的实现与应用用数组实现队列用链表实现队列队列的应用:排队模拟4、二叉树的遍历前序遍历中序遍历后序遍历5、图的表示与遍历邻接矩阵表示法邻接表表示法深度优先遍历广度优先遍历四、实验步骤1、链表的基本操作创建链表:首先定义一个链表节点结构体,包含数据域和指向下一个节点的指针域。
然后通过动态内存分配创建链表节点,并将节点逐个连接起来,形成链表。
插入节点:根据插入位置的不同,分为在表头插入、在表尾插入和在指定位置插入。
在指定位置插入时,需要先找到插入位置的前一个节点,然后进行节点的连接操作。
删除节点:同样需要根据删除位置的不同进行处理。
删除表头节点时,直接将头指针指向下一个节点;删除表尾节点时,找到倒数第二个节点,将其指针置为空;删除指定位置节点时,找到要删除节点的前一个节点,然后调整指针。
遍历链表:通过从链表头开始,依次访问每个节点,输出节点的数据。
2、栈的实现与应用用数组实现栈:定义一个固定大小的数组作为栈的存储空间,同时用一个变量记录栈顶位置。
入栈操作时,先判断栈是否已满,如果未满则将元素放入栈顶位置,并更新栈顶位置;出栈操作时,先判断栈是否为空,如果不空则取出栈顶元素,并更新栈顶位置。
用链表实现栈:与链表的操作类似,将新元素添加在链表头部作为栈顶。
括号匹配:输入一个包含括号的字符串,使用栈来判断括号是否匹配。
遇到左括号入栈,遇到右括号时与栈顶的左括号进行匹配,如果匹配成功则出栈,否则括号不匹配。
数据结构实验报告5(电大)
实验报告五查找(学科:数据结构)姓名单位班级学号实验日期成绩评定教师签名批改日期实验名称:实验五查找5.1 折半查找【问题描述】某班学生成绩信息表中,每个学生的记录已按平均成绩由高到低排好序,后来发现某个学生的成绩没有登记到信息表中,使用折半查找法把该同学的记录插入到信息表中,使信息表中的记录仍按平均成绩有序。
【基本信息】(1)建立现有学生信息表,平均成绩已有序。
(2)输入插入学生的记录信息。
(3)用折半查找找到插入位置,并插入记录。
【测试数据】自行设计。
【实验提示】(1)用结构数组存储成绩信息表。
(2)对记录中的平均成绩进行折半查找。
【实验报告内容】设计程序代码如下:#include<stdio.h>#include<string.h>#define N 5struct student{char name[10];float avg;}void insort(struct student s[],int n){int low,hight,mid,k;char y[10];float x;low=1;hight=n;strcpy(y,s[0].name );x=s[0].avg ;while(low<=hight){mid=(low+hight)/2;if(x>s[mid].avg )hight=mid-1;elselow=mid+1;}for(k=0;k<low-1;k++){strcpy(s[k].name,s[k+1].name) ;s[k].avg =s[k+1].avg ;}printf("%d",low);strcpy(s[low-1].name ,y) ;s[low-1].avg =x;}void main(){Struct student a[N]={{"caozh",96},{"cheng",95},{"zhao",93},{"wang",92},{"chen",91}};struct student stu[N];int i;for(i=0;i<N;i++)stu[i+1]=a[i];printf("初始%d 位同学的信息表\n",MAX);printf("排名姓名平均分数\n");for(i=1;i<=N;i++)printf("%d: %6s %3.2f\n",i,stu[i].name,stu[i].avg);printf("\n");printf("\n");printf("请输入学生的姓名:");scanf("%s",stu[0].name );printf("\n");printf("请输入平均成绩:");scanf("%f",&stu[0].avg );printf("\n");insort(stu,N);printf("折半排序后同学的信息表\n",MAX);printf("排名姓名平均分数\n");for(i=0;i<=N;i++){printf("%d: %6s %3.2f\n",i+1,stu[i].name,stu[i].avg);}printf("\n");}程序运行结果如下:5.2 二叉排序树的建立【问题描述】参阅相关资料,阅读建立二叉排序树的程序。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。
具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。
2、理解栈和队列的特性,并能够实现其基本操作。
3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。
4、学会使用图的数据结构,并实现图的遍历和相关算法。
二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。
三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除和查找操作。
2、链表的实现定义链表的节点结构,包含数据域和指针域。
实现链表的创建、插入、删除和查找操作。
(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。
实现栈的入栈、出栈和栈顶元素获取操作。
2、队列的实现采用循环队列的方式实现队列的数据结构。
完成队列的入队、出队和队头队尾元素获取操作。
(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。
2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。
3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。
(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。
删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。
2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。
(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。
入栈和出栈操作的时间复杂度均为 O(1)。
2、队列队列的特点是先进先出,常用于排队、任务调度等场景。
【电大本科数据结构实验报告】栈和队列的基本操作
实验报告(学科:数据结构)姓名__________________单位_______________________班级______________________实验名称:2.1 栈和队列的基本操作【问题描述】编写一个算法,输出指定栈中的栈底元素,并使得原栈中的元素倒置。
【基本要求】(1)正确理解栈的先进后出的操作特点,建立初始栈,通过相关操作显示栈底元素。
(2)程序中要体现出建栈过程和取出栈底元素后恢复栈的入栈过程,按堆栈的操作规则打印结果栈中的元素。
【实验步骤】(1)建立顺序栈SeqStack,存放测试数据;建立队列SeqQueue存放出栈数据;(2)建立InitStack、StackEmpty、StackFull、Pop、Push、GetTop函数用作顺序栈的基本操作;(3)建立InitQueue、QEmpty、Qfull、InQueue、OutQueue、ReadFront函数用作队列的基本操作;(4)建立主函数依次按序对子函数进行操作:InitStack初始化栈→Push压入数据→InitQueue初始化队列→Pop弹出数据→InQueue存入队列→OutQueue出队列→Push压入栈→Pop弹出数据→free清空栈与队列。
在数据的输入与数据的输出时提供必要的提示信息。
(5)使用Visual Studio C++ 2005语言环境进行调试,源代码P202-2-1.cpp通过编译生成目标文件P202-2-1.obj,运行可执行文件:实验2-2-1.exe测试通过。
【源代码】#include "stdio.h"#include "stdlib.h"#define MaxSize 8typedef int ElemType;/*顺序栈的类型定义*/struct SeqStack{ElemType data[MaxSize];int top;};struct SeqStack * s;/*顺序队列的类型定义*/struct SeqQueue{ElemType data[MaxSize];int front,rear;};struct SeqQueue * sq;/*栈的基本运算*//*初始化栈操作*/void InitStack(struct SeqStack * s){s->top=-1;}/*判断栈空操作*/int StackEmpty(struct SeqStack * s){if(s->top==-1){ return(1);}else{return(0);}}/*判断栈满操作*/int StackFull(struct SeqStack * s){if(s->top==MaxSize-1){ return(1);}else{ return(0);}}/*压栈操作*/void Push(struct SeqStack *s,ElemType x) {if(s->top==MaxSize-1){printf("栈满溢出错误!\n");exit(1);}s->top++;s->data[s->top]=x;}/*弹栈操作*/ElemType Pop(struct SeqStack * s){if(StackEmpty(s)){printf("栈下溢错误!!\n");return(1);}s->top--;return s->data[s->top+1];}/*获取栈顶元素操作*/ElemType GetTop(struct SeqStack * s){if(StackEmpty(s)){printf("栈下溢错误!\n");exit(1);}return s->data[s->top];}/*队列的基本运算*//*初始化队列*/void InitQueue(struct SeqQueue * sq){sq->front=0;sq->rear=0;}/*判队空*/int QEmpty(struct SeqQueue * sq){if(sq->front==sq->rear){printf("队列已空,不能进行出队操作!\n");return(1); /*如果链队为空,则返回*/}else{return(0); /*否则返回*/ };}/*判队满*/int Qfull(struct SeqQueue * sq){if(sq->rear==MaxSize){ /*判队列是否已满*/printf("队列已满!\n");return(1); /*入队失败,退出函数运行*/ }return(0);}/*入队列操作*/void InQueue(struct SeqQueue * sq, int x){if(!Qfull(sq)){sq->data[sq->rear]=x; /*数据送给队尾指针所指单元*/sq->rear++; /*将队尾指针加*/ }}/*出队列操作*/ElemType OutQueue(struct SeqQueue *sq){if(sq->rear==sq->front){ /*判断队列是否为空*/printf("队列已空,不能进行出队操作!!\n");return(1); /*出队失败,退出函数运行*/ }sq->front++;return sq->data[sq->front-1];}/*读队头元素*/void ReadFront(struct SeqQueue * sq,int x){if(!QEmpty(sq)){sq->front++; /*将头指针加,前移*/OutQueue(sq); /*出队列操作*/ }}void main(){int n;struct SeqStack *a=(SeqStack *)malloc(sizeof(struct SeqStack));/*分配栈的内存空间,使结构指针a指向栈地址*/struct SeqQueue *sq=(SeqQueue *)malloc(sizeof(struct SeqQueue));InitStack(a);do{printf("输入栈中的数据:");scanf("%d",&n);Push(a,n);/*把数据压入栈中*/}while(!StackFull(a));InitQueue(sq);do{InQueue(sq,Pop(a)); /*弹出栈数据,把数据放进队列中*/}while(!(StackEmpty(a)&&Qfull(sq)));do{Push(a,OutQueue(sq)); /*从队列输出数据,把数据压入到栈内*/}while(!(QEmpty(sq)&&StackFull(a)));do{printf("输出栈中的数据:%d\n",Pop(a)); /*弹出栈中所有数据*/ }while(!StackEmpty(a));free(a);free(sq);}【实验数据】【结论】由于栈的结构特点决定了栈对数据的操作规则。
电大数据结构实验报告
实验一单链表的插入,删除,初始化一、实验环境Windows xp 操作系统 Turbo C 2.0二、实验目的通过对链表的实际操作,巩固链表的基本知识,关键是掌握指针的操作。
三、实验内容生成一个头指针是head的单链表,然后对该链表进行插入和删除运算。
四、实验要求1 编写程序生成一个单链表;2 插入、删除用子程序实现;3 输出每次运算前后的链表,进行比较与分析。
五、实验步骤#include <stdlib.h>#include <stdio.h>#define NULL 0typedef struct LNode{int data;struct LNode *next;}LNode, *LinkList;//假设下面的单链表均为带头结点。
void CreatLinkList(LinkList &head,int j){//建立一个单链表L;,数据为整数,数据由键盘随机输入。
int i;LinkList p,q;head=(LinkList)malloc(sizeof(LNode));head->next=NULL;q=head;printf("在单链表内输入整数:\n");for(i=0;i<j;i++){ p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);p->next=q->next;q->next=p;q=p;}}int PrintLinkList(LinkList &L){//输出单链表L的数据元素LNode *p;p=L->next;if(L->next==NULL){printf("链表没有元素!\n");return 0;}printf("单链表的数据元素为:");while(p){printf("%d ",p->data);p=p->next;}printf("\n");//return 1;}void LinkListLengh(LinkList &L){//计算单链表L的数据元素个数。
《数据结构》实训报告
《数据结构》实训报告数据结构实训报告一、实训目的和意义数据结构是计算机科学与技术专业的一门重要基础课程,通过学习数据结构可以帮助我们提高程序的效率和优化算法的性能。
在这次实训中,我们旨在通过实践应用所学的数据结构知识,进行问题解决和算法设计,提高我们的编程能力和思维逻辑。
二、实训内容和过程本次实训主要包括以下几个部分:线性表的应用、栈和队列的实现、树和图的应用。
首先,我们针对线性表的应用,选择了用数组实现一个顺序表和用链表实现一个单链表。
通过实际编程和调试,我们深入了解了数组和链表的特性和功能,并对其进行了性能对比和分析。
顺序表适合查找操作,但插入和删除操作的效率较低;而链表则可以实现快速插入和删除操作,但查找效率相对较低。
接着,我们实现了栈和队列这两种常用的数据结构。
我们分别使用数组和链表实现了栈和队列,并进行了相关操作的测试。
通过实际运行和验证,我们了解到栈和队列的应用场景和特点。
栈适用于递归和表达式求值等场景,而队列则适用于模拟等先进先出的场景。
最后,我们进行了树和图的应用。
我们实现了一个二叉树,并对其进行了遍历的操作。
此外,我们使用邻接矩阵实现了一个有向图,并进行了深度优先和广度优先的操作。
通过实践,我们加深了对树和图结构的理解,以及相关算法的应用和分析。
三、实践总结和收获通过这次数据结构的实训,我们学到了很多理论知识的应用和实践技巧。
具体来说,我们深入了解了线性表、栈、队列、树和图等数据结构的基本概念、特性和实现方式。
同时,我们掌握了相应的算法设计和优化的方法。
在实践过程中,我们遇到了不少问题和困难。
例如,在实现链表时,我们经常会出现指针指向错误或者内存泄漏的情况。
但通过调试和修改,我们逐渐克服了这些问题,并成功完成了实践任务。
通过这次实训,我们不仅提高了编程实践的能力,更重要的是加深了对数据结构的理解和应用。
我们了解了不同数据结构之间的特点和适用场景,能够根据实际问题选择合适的数据结构和算法。
数据结构实验实训总结报告
一、实验背景随着计算机技术的飞速发展,数据结构作为计算机科学的重要基础,已经成为现代软件开发和数据处理的关键技术。
为了提高学生的数据结构应用能力,我们学校开设了数据结构实验实训课程。
本课程旨在通过实验实训,使学生深入理解数据结构的基本概念、性质、应用,掌握各种数据结构的实现方法,提高编程能力和解决实际问题的能力。
二、实验内容本次数据结构实验实训主要包括以下内容:1. 数据结构的基本概念和性质通过实验,使学生掌握线性表、栈、队列、串、树、图等基本数据结构的概念、性质和应用场景。
2. 数据结构的存储结构通过实验,使学生熟悉线性表、栈、队列、串、树、图等数据结构的顺序存储和链式存储方法,了解不同存储结构的优缺点。
3. 数据结构的操作算法通过实验,使学生掌握线性表、栈、队列、串、树、图等数据结构的插入、删除、查找、遍历等基本操作算法。
4. 数据结构的实际应用通过实验,使学生了解数据结构在各个领域的应用,如网络数据结构、数据库数据结构、人工智能数据结构等。
三、实验过程1. 实验准备在实验开始前,教师首先对实验内容进行讲解,使学生了解实验目的、实验步骤和实验要求。
同时,教师要求学生预习实验内容,熟悉相关理论知识。
2. 实验实施(1)线性表:通过实现线性表的顺序存储和链式存储,实现插入、删除、查找等操作。
(2)栈和队列:通过实现栈和队列的顺序存储和链式存储,实现入栈、出栈、入队、出队等操作。
(3)串:通过实现串的顺序存储和链式存储,实现串的插入、删除、查找等操作。
(4)树:通过实现二叉树、二叉搜索树、平衡二叉树等,实现树的插入、删除、查找、遍历等操作。
(5)图:通过实现图的邻接矩阵和邻接表存储,实现图的插入、删除、查找、遍历等操作。
3. 实验总结实验结束后,教师组织学生进行实验总结,总结实验过程中的收获和不足,提出改进措施。
四、实验成果通过本次数据结构实验实训,学生取得了以下成果:1. 掌握了数据结构的基本概念、性质和应用场景。
数据结构实验报告5
数据结构实验报告5正文:1. 引言本实验报告旨在介绍数据结构的相关概念和算法,并通过具体案例分析展示其应用。
该报告包含以下章节:背景知识、实验目标、方法与步骤、结果与讨论以及总结。
2. 背景知识在开始进行实验之前,我们需要了解一些基础的数据结构概念,如数组、链表等。
此外还需掌握常见的排序算法(例如冒泡排序和快速排序)以及查找算法(例如二分查找)。
这些基础知识将为后续实验提供必要支持。
3. 实验目标本次实验有两个主要目标:- 理解并独立编写各种数据结构;- 探索不同类型的问题,并使用适当的数据结构来解决它们;4. 方法与步骤4.1 数据集准备阶段:首先,我们需要选择一个合适且真是性质良好地测试样例作为输入。
然后根据所选题型设计相应规模大小或特殊情形下得到期望输出值。
最后对于每组样例都能够正确运行程序代码而产生预期答案即可进入下一环节。
4.2 编码阶段:按照给定任务的要求,使用合适的数据结构和算法编写代码。
确保程序能够正确地处理各种输入情况,并返回预期结果。
4.3 测试与分析阶段:对于每个实验样例,我们需要进行测试以验证其准确性。
通过比较输出结果与预期答案来判断是否成功解决问题。
同时还需考虑时间复杂度、空间复杂度等因素评估所设计算法的效率及优劣程度。
5. 结果与讨论在本节中将展示并讨论实验过程中得到的具体结果。
包括但不限于:- 算法运行时间;- 内存占用情况;- 输出正确性;6. 总结总结报告内容,并回顾整个实验流程和成果。
指出可能存在改进之处或者未来可以深入研究探索领域。
附件:(请参见相关文件)注释:1)数组:一组连续内存单元集合,在计算机科学中广泛应用。
2)链表:由节点组成线性序列,其中每一个节点都连接着下一个节点地址信息。
数据结构课程实验报告
数据结构课程实验报告一、实验目的本次数据结构课程实验的主要目的是通过实践掌握常见数据结构的基本操作,包括线性结构、树形结构和图形结构。
同时,也要求学生能够熟练运用C++语言编写程序,并且能够正确地使用各种算法和数据结构解决具体问题。
二、实验内容本次实验涉及到以下几个方面:1. 线性表:设计一个线性表类,并且实现线性表中元素的插入、删除、查找等基本操作。
2. 栈和队列:设计一个栈类和队列类,并且分别利用这两种数据结构解决具体问题。
3. 二叉树:设计一个二叉树类,并且实现二叉树的遍历(前序遍历、中序遍历和后序遍历)。
4. 图论:设计一个图类,并且利用图论算法解决具体问题(如最短路径问题)。
三、实验过程1. 线性表首先,我们需要设计一个线性表类。
在这个类中,我们需要定义一些成员变量(如线性表大小、元素类型等),并且定义一些成员函数(如插入元素函数、删除元素函数等)。
在编写代码时,我们需要注意一些细节问题,如边界条件、异常处理等。
2. 栈和队列接下来,我们需要设计一个栈类和队列类。
在这两个类中,我们需要定义一些成员变量(如栈顶指针、队头指针等),并且定义一些成员函数(如入栈函数、出栈函数、入队函数、出队函数等)。
在编写代码时,我们需要注意一些细节问题,如空间不足的情况、空栈或空队列的情况等。
3. 二叉树然后,我们需要设计一个二叉树类,并且实现二叉树的遍历。
在这个类中,我们需要定义一个节点结构体,并且定义一些成员变量(如根节点指针、节点数量等),并且定义一些成员函数(如插入节点函数、删除节点函数、遍历函数等)。
在编写代码时,我们需要注意一些细节问题,如递归调用的情况、空节点的情况等。
4. 图论最后,我们需要设计一个图类,并且利用图论算法解决具体问题。
在这个类中,我们需要定义一个邻接矩阵或邻接表来表示图形结构,并且定义一些成员变量(如顶点数量、边的数量等),并且定义一些成员函数(如添加边函数、删除边函数、最短路径算法等)。
数据结构课程实验报告
数据结构课程实验报告数据结构课程实验报告引言:数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和管理方法。
在数据结构课程中,我们学习了各种数据结构的原理和应用,并通过实验来加深对这些概念的理解。
本文将对我在数据结构课程中的实验进行总结和分析。
实验一:线性表的实现与应用在这个实验中,我们学习了线性表这种基本的数据结构,并实现了线性表的顺序存储和链式存储两种方式。
通过实验,我深刻理解了线性表的插入、删除和查找等操作的实现原理,并掌握了如何根据具体应用场景选择合适的存储方式。
实验二:栈和队列的实现与应用栈和队列是两种常见的数据结构,它们分别具有后进先出和先进先出的特点。
在这个实验中,我们通过实现栈和队列的操作,加深了对它们的理解。
同时,我们还学习了如何利用栈和队列解决实际问题,比如迷宫求解和中缀表达式转后缀表达式等。
实验三:树的实现与应用树是一种重要的非线性数据结构,它具有层次结构和递归定义的特点。
在这个实验中,我们学习了二叉树和二叉搜索树的实现和应用。
通过实验,我掌握了二叉树的遍历方法,了解了二叉搜索树的特性,并学会了如何利用二叉搜索树实现排序算法。
实验四:图的实现与应用图是一种复杂的非线性数据结构,它由节点和边组成,用于表示事物之间的关系。
在这个实验中,我们学习了图的邻接矩阵和邻接表两种存储方式,并实现了图的深度优先搜索和广度优先搜索算法。
通过实验,我深入理解了图的遍历方法和最短路径算法,并学会了如何利用图解决实际问题,比如社交网络分析和地图导航等。
实验五:排序算法的实现与比较排序算法是数据结构中非常重要的一部分,它用于将一组无序的数据按照某种规则进行排列。
在这个实验中,我们实现了常见的排序算法,比如冒泡排序、插入排序、选择排序和快速排序等,并通过实验比较了它们的性能差异。
通过实验,我深入理解了排序算法的原理和实现细节,并了解了如何根据具体情况选择合适的排序算法。
结论:通过这些实验,我对数据结构的原理和应用有了更深入的理解。
数据结构实验报告
数据结构实验报告摘要:本实验是针对数据结构概念与应用的课程要求进行的,主要目的是通过实践掌握各种数据结构的基本操作和应用场景。
在实验中,我们学习了线性表、栈、队列、二叉树等数据结构,并实现了它们的各种操作。
通过实验,我们深入理解了数据结构的原理和应用,并且掌握了如何在实际项目中应用各种数据结构来解决问题。
1. 引言数据结构是计算机科学中的一个重要概念,它研究如何组织和存储数据以及如何在这些数据上进行操作。
它对于算法的设计和优化起着至关重要的作用。
本次实验旨在通过实践,加深对数据结构的理解,并掌握其基本操作和应用场景。
2. 实验目的本实验的主要目的是:(1) 理解线性表、栈、队列和二叉树等数据结构的概念和特点;(2) 掌握各种数据结构的基本操作,如插入、删除、查找等;(3) 学会在实际项目中应用各种数据结构,解决实际问题。
3. 实验工具本实验使用的工具有:(1) 编程语言:C++;(2) 集成开发环境:Visual Studio;(3) 相关库:标准模板库(STL)。
4. 实验内容和步骤4.1 线性表线性表是最基本的数据结构之一,它包括顺序表和链表两种形式。
在本实验中,我们实现了一个基于顺序表的线性表。
具体步骤如下:(1) 定义线性表的数据结构和基本操作函数;(2) 实现线性表的初始化、插入、删除、查找、修改等基本操作;(3) 编写测试代码,验证线性表的功能和正确性。
4.2 栈栈是一种特殊的线性表,它遵循先进后出(LIFO)的原则。
在本实验中,我们实现了一个基于数组的栈。
具体步骤如下:(1) 定义栈的数据结构和基本操作函数;(2) 实现栈的初始化、入栈、出栈、查看栈顶元素等基本操作;(3) 编写测试代码,验证栈的功能和正确性。
4.3 队列队列是另一种特殊的线性表,它遵循先进先出(FIFO)的原则。
在本实验中,我们实现了一个基于链表的队列。
具体步骤如下:(1) 定义队列的数据结构和基本操作函数;(2) 实现队列的初始化、入队、出队、查看队首元素等基本操作;(3) 编写测试代码,验证队列的功能和正确性。
数据结构实习报告(共8篇)
数据结构实习报告(共8篇)数据结构实习报告(共8篇)第1篇:数据结构实_报告附件:实_报告格式,如下:数据结构实_报告班级:姓名:xxx(1514)xxx(1514)xxx(1514)指导教师:日期:题目一、问题描述(把你所选的题目及要求说一下)二、概要设计(抽象数据类型定义)三、详细设计(主要算法和函数间的调用关系)四、调试分析(调式过程中出现的问题及如何改正)五、心得体会(组内成员的分工及实_期间的体会)六、用户手册(系统的使用方法介绍)可参照_题集上的实_报告格式。
第2篇:数据结构实_报告数据结构实_报告班级:13软件二班姓名:殷健学号:1345536225子集和数问题1:问题描述子集和数问题1:子集和问题的为W,c。
其中,W=w1,w2,.,wn是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得W1=cW(02:问题分析程序中设计了函数voidputeSumofSub(ints,intk,intr),其意义是从第k项开始,如果s(已经决策的和数)和wk(当前元素)之和为和数,就把结果输出来,否则如果s与,wk,wk+1之和小于和数,则调用puteSumofsub(s+wk,k+1,r-wk),意为选择此结点的左分支,再判断s和后面所有元素之和是否不小于M(所有的加起来都小,必定无解),并且s+wk+1M,也是无解),若条件符合即调用puteSumofSub(s,k+1,r-wk),即选择当前结点的右分支。
算法展示:#includeusingnamespacestd;#include#include#defineM50claSu mOfSubprivate:intwM;intm;intxM;public:SumOfSub(inta,intb, intn)for(inti=0;i=mvoidmain()intsum=0;intwM;srand(unsigne d)time(NULL);for(inti=0;icoutcoutcoutm;sum=m*sum;cout复杂性分析:对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2n。
电大《数据结构》实验报告
数据结构形成性考核册实验名称:实验一线性表线性表的链式存储结构【问题描述】某项比赛中,评委们给某参赛者的评分信息存储在一个带头结点的单向链表中,编写程序:(1)显示在评分中给出最高分和最低分的评委的有关信息(姓名、年龄、所给分数等)。
(2)在链表中删除一个最高分和一个最低分的结点。
(3)计算该参赛者去掉一个最高分和一个最低分后的平均成绩。
【基本要求】(1)建立一个评委打分的单向链表;(2)显示删除相关结点后的链表信息。
(3)显示要求的结果。
【实验步骤】(1)运行PC中的Microsoft Visual C++ 程序,(2)点击“文件”→“新建”→对话窗口中“文件”→“c++ Source File”→在“文件名”中输入“”→在“位置”中选择储存路径为“桌面”→“确定”,(3)输入程序代码,程序代码如下:#include <>#include <>#include <>#include <>#include <>#define NULL 0#define PWRS 5 2.2f ge=n; ame);printf("性别0女1男: ");scanf("%d",&m[i].sex);printf("年龄: ");scanf("%d",&m[i].age);printf("\n");}return 1;}int calc(STD *m,STD *n,STD *r,float &Fage,float &Mage){ int i,j=1,k=1;n[0].age=r[0].age=0;for( i=1;i<=m[0].age;i++){ if(m[i].sex==0){strcpy(n[j].name,m[i].name);n[j].sex=m[i].sex; n[j].age=m[i].age;n[0].age++; Mage+=m[i].age;j++;}else{strcpy(r[k].name,m[i].name);r[k].sex=m[i].sex; r[k].age=m[i].age;r[0].age++;Fage+=m[i].age;k++;}}Mage=Mage/n[0].age; Fage=Fage/r[0].age;cout<<"女生的平均年龄是:"<<Mage<<"男生的平均年龄是:"<<Fage<<endl;return 1;}void print(STD *m){for(int i=1;i<=m[0].age;i++){printf ("姓名:%3s, 性别(0女1男):%d, 年龄:%d\n",m[i].name,m[i].sex,m[i].age);}}程序运行结果如下:实验结束。
最新电大《数据结构》实验报告
数据结构形成性考核册实验名称:实验一线性表线性表的链式存储结构【问题描述】某项比赛中,评委们给某参赛者的评分信息存储在一个带头结点的单向链表中,编写程序:(1)显示在评分中给出最高分和最低分的评委的有关信息(姓名、年龄、所给分数等)。
(2)在链表中删除一个最高分和一个最低分的结点。
(3)计算该参赛者去掉一个最高分和一个最低分后的平均成绩。
【基本要求】(1)建立一个评委打分的单向链表;(2)显示删除相关结点后的链表信息。
(3)显示要求的结果。
【实验步骤】(1)运行PC中的Microsoft Visual C++ 6.0程序,(2)点击“文件”→“新建”→对话窗口中“文件”→“c++ Source File”→在“文件名”中输入“X1.cpp”→在“位置”中选择储存路径为“桌面”→“确定”,(3)输入程序代码,程序代码如下:#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <iostream.h>#include <conio.h>#define NULL 0#define PWRS 5 //定义评委人数struct pw //定义评委信息{ char name[6];float score;int age;};typedef struct pw PW;struct node //定义链表结点{struct pw data;struct node * next;};typedef struct node NODE;NODE *create(int m); //创建单链表int calc(NODE *h); //计算、数据处理void print(NODE *h); //输出所有评委打分数据void input(NODE *s);//输入评委打分数据void output(NODE *s);//输出评委打分数据void main(){NODE *head;float ave=0;float sum=0;head=create(PWRS);printf("所有评委打分信息如下:\n");print(head);//显示当前评委打分calc(head);//计算成绩printf("该选手去掉1 最高分和1 最低分后的有效评委成绩:\n");print(head);//显示去掉极限分后的评委打分}void input(NODE *s){printf("请输入评委的姓名: ");scanf("%S",&s->);printf("年龄: ");scanf("%d",&s->data.age);printf("打分: ");scanf("%f",&s->data.score);printf("\n");}void output(NODE *s){printf("评委姓名: %8s ,年龄: %d,打分: %2.2f\n",s->,s->data.age,s->data.score); }NODE *create(int m){NODE *head,*p,*q;int i;p=(NODE*)malloc(sizeof(NODE));head=p;q=p;p->next=NULL;for(i=1;i<=m;i++){p=(NODE*)malloc(sizeof(NODE));input(p);p->next=NULL;q->next=p;q=p;}return (head);}void print(NODE *h){ for(int i=1;((i<=PWRS)&&(h->next!=NULL));i++){h=h->next;output(h); }printf("\n");}int calc(NODE *h){NODE *q,*p,*pmin,*pmax;float sum=0;float ave=0;p=h->next; //指向首元结点pmin=pmax=p; //设置初始值sum+=p->data.score;p=p->next;for(;p!=NULL;p=p->next){if(p->data.score>pmax->data.score) pmax=p;if(p->data.score<pmin->data.score) pmin=p;sum+=p->data.score;}cout<<"给出最高分的评委姓名:"<<pmax-><<"年龄:"<<pmax->data.age<<"分值:"<<pmax->data.score<<endl;cout<<"给出最低分的评委姓名:"<<pmin-><<"年龄:"<<pmin->data.age<<"分值:"<<pmin->data.score<<endl;printf("\n");sum-=pmin->data.score;sum-=pmax->data.score;for (q=h,p=h->next;p!=NULL;q=p,p=p->next){if(p==pmin){q->next=p->next; p=q;}//删除最低分结点if(p==pmax) {q->next=p->next; p=q;}//删除最高分结点}ave=sum/(PWRS-2);cout<<"该选手的最后得分是:"<<ave<<endl;return 1;}程序运行结果如下:线性表的顺序存储结构【问题描述】用顺序表A记录学生的信息,编写程序:(1)将A表分解成两个顺序表B和C,使C表中含原A表中性别为男性的学生,B表中含原表中性别为女性的学生,要求学生的次序与原A表中相同。
数据结构 实验报告五
实验小结:通过本次实验,我学会了掌握查找的不同方法,并能用高级语言 实现查找算法;基本上掌握顺序表的查找方法和有序顺序表的折半查找算法以及 静态查找树的构造方法和查找算法;对于二叉排序树的生成、插入、删除、输出 运算有了初步的了解。
教师评语: 1. 实验结果及解释:( 准确合理、 较准确、 不合理 );占 30% 2. 实验步骤的完整度:( 完整、 中等、 不完整 );占 30% 3. 实验程序的正确性:( 很好、 较好、 中等、 较差、 很差 );占 30% 4. 卷面整洁度:( 很好、 较好、 中等、 较差、 很差 );占 10%
if(cmd=='c'||cmd=='C')
{cout<<"请输入你所要创建的二叉树的结点的值,以-1 结束:\n";
root=creatut<<"中序遍历二叉树:"<<endl;
inorder_btree(root);
cout<<"\n 请选择你要对这棵二叉树所做的操作:查找:S.插入:I.删除:D.退出:Q"<<endl;
{BSTree t=NULL;
KeyType key;
cin>>key;
while(key!=-1)
{t=insertBST(t,key);
cin>>key;}
return t;}
void inorder_btree(BSTree root)
{BSTree p=root;
if(p!=NULL){
inorder_btree(p->left );
else return searchBST(t->right,key); }
数据结构实验报告实验5
数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,通过实际编程实现和操作,提高对数据结构的应用能力和编程技巧。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验内容1、线性表的基本操作实现线性表的创建、插入、删除、查找等基本操作。
对不同操作的时间复杂度进行分析和比较。
2、栈和队列的应用利用栈实现表达式求值。
使用队列模拟银行排队系统。
3、二叉树的遍历实现二叉树的先序、中序、后序遍历算法。
分析不同遍历算法的特点和应用场景。
4、图的表示和遍历采用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先遍历和广度优先遍历算法。
四、实验步骤及结果1、线性表的基本操作首先,定义了一个线性表的结构体,包含数据域和指针域。
创建线性表时,动态分配内存空间,并初始化表头和表尾指针。
插入操作分为表头插入、表尾插入和指定位置插入。
在指定位置插入时,需要先找到插入点的前一个节点,然后进行插入操作。
删除操作同样需要找到要删除节点的前一个节点,然后释放删除节点的内存空间,并调整指针。
查找操作通过遍历线性表,逐个比较数据值来实现。
经过测试,不同操作的时间复杂度如下:创建操作的时间复杂度为 O(1)。
插入操作在表头和表尾插入的时间复杂度为 O(1),在指定位置插入的时间复杂度为 O(n)。
删除操作的时间复杂度为 O(n)。
查找操作的平均时间复杂度为 O(n)。
2、栈和队列的应用表达式求值:将表达式转换为后缀表达式,然后利用栈进行计算。
遇到操作数则入栈,遇到操作符则从栈中弹出两个操作数进行计算,并将结果入栈。
最后栈顶元素即为表达式的结果。
银行排队系统:使用队列模拟客户的排队过程。
客户到达时入队,服务窗口空闲时从队列头部取出客户进行服务。
实验结果表明,栈和队列能够有效地解决相关问题,提高程序的效率和可读性。
3、二叉树的遍历先序遍历:先访问根节点,然后递归遍历左子树,最后递归遍历右子树。
国开(电大)数据结构课程实验报告5
数据结构课程实验报告2、创建完毕后OS Lab 会自动打开这个新建的项目。
在“项目管理器”窗口中,树的根节点表示项目,可以看到项目的名称是“console”,各个子节点是项目包含的文件夹或者文件。
此项目的源代码主要包含一个头文件“console.h”和一个C语言源文件“console.c”,如图2所示。
2.2 生成项目在“生成”菜单中选择“生成项目”。
在项目的生成过程中,“输出”窗口会实时显示生成的进度和结果。
如果源代码中不包含语法错误,会在最后提示生成成功,如图3所示。
2.3 执行项目在OS Lab中选择“调试”菜单中的“开始执行(不调试)”,就可以执行此控制台应用程序。
启动执行后会弹出一个Windows控制台窗口,显示控制台应用程序输出的内容。
按任意键即可关闭此控制台窗口,结果如图4。
2.4 调试项目1、调试功能之前,对例子程序进行必要的修改,步骤如下:(1)右键点击“项目管理器”窗口中的“源文件”文件夹节点,在弹出的快捷菜单中选择“添加”中的“添加新文件”。
(2)在弹出的“添加新文件”对话框中选择“C 源文件”模板。
(3)在“名称”中输入文件名称“func”。
(4)点击“添加”按钮添加并自动打开文件func.c,此时的“项目管理器”窗口如图5所示。
2、在func.c 文件中添加函数:int Func (int n) {n = n + 1; return n; }3、点击源代码编辑器上方的console.c标签,切换到console.c文件。
将main 函数修改为:int main (int argc, char* argv[]) {int Func (int n); // 声明Func函数int n = 0;n = Func(10);printf ("Hello World!\n");return 0;}4、代码修改完毕后按F7(“生成项目”功能的快捷键)。
注意查看“输出”窗口中的内容,如果代码中存在语法错误,就根据提示进行修改,直到成功生成项目,结果如图6所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告五查找(学科:数据结构)
姓名单位班级学号实验日期成绩评定教师签名批改日期
实验名称:实验五查找
5.1 折半查找
【问题描述】
某班学生成绩信息表中,每个学生的记录已按平均成绩由高到低排好序,后来发现某个学生的成绩没有登记到信息表中,使用折半查找法把该同学的记录插入到信息表中,使信息表中的记录仍按平均成绩有序。
【基本信息】
(1)建立现有学生信息表,平均成绩已有序。
(2)输入插入学生的记录信息。
(3)用折半查找找到插入位置,并插入记录。
【测试数据】
自行设计。
【实验提示】
(1)用结构数组存储成绩信息表。
(2)对记录中的平均成绩进行折半查找。
【实验报告内容】
设计程序代码如下:
#include<stdio.h>
#include<string.h>
#define N 5
struct student{
char name[10];
float avg;
}
void insort(struct student s[],int n)
{
int low,hight,mid,k;
char y[10];
float x;
low=1;
hight=n;
strcpy(y,s[0].name );
x=s[0].avg ;
while(low<=hight)
{
mid=(low+hight)/2;
if(x>s[mid].avg )
hight=mid-1;
else
low=mid+1;
}
for(k=0;k<low-1;k++){
strcpy(s[k].name,s[k+1].name) ;
s[k].avg =s[k+1].avg ;
}
printf("%d",low);
strcpy(s[low-1].name ,y) ;
s[low-1].avg =x;
}
void main()
{
Struct student a[N]=
{{"caozh",96},{"cheng",95},{"zhao",93},{"wang",92},{"chen",91}};
struct student stu[N];
int i;
for(i=0;i<N;i++)
stu[i+1]=a[i];
printf("初始%d 位同学的信息表\n",MAX);
printf("排名姓名平均分数\n");
for(i=1;i<=N;i++)
printf("%d: %6s %3.2f\n",i,stu[i].name,stu[i].avg);
printf("\n");
printf("\n");
printf("请输入学生的姓名:");
scanf("%s",stu[0].name );
printf("\n");
printf("请输入平均成绩:");
scanf("%f",&stu[0].avg );
printf("\n");
insort(stu,N);
printf("折半排序后同学的信息表\n",MAX);
printf("排名姓名平均分数\n");
for(i=0;i<=N;i++)
{
printf("%d: %6s %3.2f\n",i+1,stu[i].name,stu[i].avg);
}
printf("\n");
}
程序运行结果如下:
5.2 二叉排序树的建立
【问题描述】
参阅相关资料,阅读建立二叉排序树的程序。
【基本要求】
(1)掌握建立二叉排序树的原理和方法。
(2)能跟踪程序人工建立二叉排序树。
【实验报告内容】
设计程序代码如下:
#include<stdio.h>
#include<stdlib.h>
#define MAX 5
typedef struct Bnode
{
int key;
struct Bnode *left;
struct Bnode *right;
}Bnode;
Bnode * btInsert(int x,Bnode *root);
void Inorder(Bnode *root);
void main()
{
int i;
int a[MAX]={60,40,70,20,80};
Bnode * root=NULL;
printf("按关键字序列建立二叉排序树\n");
for(i=0;i<MAX;i++) printf("%d ",a[i]);
printf("\n");
for(i=0;i<MAX;i++) root=btInsert(a[i],root);
printf("中序遍历的二叉排序树\n");
Inorder(root);
printf("\n");
}
Bnode * btInsert(int x,Bnode * root)
{
Bnode *p,*q;
int flag=0;
p=(Bnode *)malloc(sizeof(Bnode));
p->key=x;
p->right=p->left=NULL;
if(root==NULL)
{ root=p; return p; }
q=root;
while(flag==0)
{
if(q->key>x)
{
if(q->left!=NULL)
q=q->left;
else
{
q->left=p;
flag=1;
}
}
else
{
if(q->right!=NULL)
q=q->right;
else
{
q->right=p;
flag=1;
}
}
}
return root;
}
void Inorder(Bnode *root)
{
if(root!=NULL) {
Inorder(root->left);
printf("%d ",root->key);
Inorder(root->right);
}
}
程序运行结果如下:。