实验7
1.给定无向图,请用邻接矩阵表示法表示该图
2.分别使用邻接矩阵表示法和邻接表表示法,用深度优先搜索法遍历该图。
3.对学生选课工程图进行拓扑排序.(算法 7.12 )
1.给定无向图,请用邻接矩阵表示法表示该图
#include
#include
using namespace std;
#define MAX 20
typedef int Adj[MAX][MAX];
typedef struct{
v 4
v 5 v 3
v 2 v 1
string vexs[MAX]; //顶点表
Adj arcs; //邻接矩阵
int vexnum,arcnum; //图的顶点和弧数
}MGraph;
int LocateVex(MGraph &G,string u);
int CreateUDN(MGraph &G){
int i,k,j;string v1,v2;
cout<<"请输入顶点数、弧数:";
cin>>G.vexnum>>G.arcnum;
cout<<"输入顶点:";
for(i=0;i cin>>G.vexs[i]; //构造顶点数 } for(i=0;i for(j=0;j G.arcs[i][j]=0; } } for(k=0;k cout<<"输入第"< cin>>v1>>v2; i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j]=1; G.arcs[j][i]=1; //置 } return 0; } int LocateVex(MGraph &G,string u){ //确定u在G中序号int i; for (i=0;i if (u==G.vexs[i]) return i; } if (i==G.vexnum){ cout<<"Error u!"< exit(1); } return 0; } void ShowG(MGraph &G){ int i,j; for(i=0;i cout< } cout< for(i=0;i for(j=0;j cout< } cout< } } main(){ MGraph A; int a; a=CreateUDN(A); ShowG(A); } 2.分别使用邻接矩阵表示法和邻接表表示法,用深度优先搜索法遍历该图。 #include # include # include # include using namespace std; int visited[30]; # define MAX_VERTEX_NUM 30 # define OK 1 //typedef int VertexType; typedef int InfoType; typedef struct ArcNode //弧 { int adjvex; struct ArcNode *nextarc; }ArcNode; typedef struct VNode//表头 { int data; ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct//图 { AdjList vertices; int vexnum,arcnum; int kind; }ALGraph; void CreateDG(ALGraph &G) { int k,i,v1; cout< cin>>G.vexnum; cout<<"请输入弧的个数: "; cin>>G.arcnum; for(i=1;i<=G.vexnum;i++)//初使化表头 { G.vertices[i].data=i; G.vertices[i].firstarc=NULL; } for(k=1;k<=G.vexnum;k++) //输入边 { int v2; cout<<"请输入与结点"< cin>>v2; cout<<"请输入与第"< cin>>v1; ArcNode *p; p=(ArcNode*)malloc(sizeof(ArcNode)); if(!p) exit(-1); p->adjvex=v1; p->nextarc=NULL; G.vertices[k].firstarc=p; for(int i=1;i { int m; cout<<"请输入与第"< cin>>m; ArcNode *q; q=(ArcNode *)malloc(sizeof(ArcNode));//动态指针 if(!q) exit(-1); q->adjvex=m; //顶点给P q->nextarc=NULL; p->nextarc=q; p=q; //free(q); } //free(p); } } void DFS (ALGraph G,int v )//深度搜索 { visited[v]=1; cout< ArcNode *x; x=(ArcNode*)malloc(sizeof(ArcNode)); if(!x) exit(-1); x=G.vertices[v].firstarc; int w; for (;x;x=x->nextarc) { w=x->adjvex; if(visited[w]==0) DFS(G,w); } } void DFSB (ALGraph G,int v)//深度搜索的边集{ visited[v]=1; ArcNode *y; y=(ArcNode*)malloc(sizeof(ArcNode)); if(!y) exit(-1); y=G.vertices[v].firstarc; int u=G.vertices[v].data; int w; for(;y;y=y->nextarc) { w=y->adjvex; if(visited[w]==0) { cout<"< DFSB(G,w); } } } typedef struct QNode { int data; QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; void InitQueue (LinkQueue &Q)//建立一个空队列{ Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front) exit(-1); Q.front->next=NULL; } void EnQueue (LinkQueue &Q,int e)//进队 { QNode *p; p=(QNode*)malloc(sizeof(QNode)); if(!p) exit(-1); p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; //free(p); } int DeQueue (LinkQueue &Q,int &e)//出队 { if(Q.front==Q.rear) return -1; QNode *p; p=(QNode*)malloc(sizeof(QNode)); if(!p) exit(-1); p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); return e; } int QueueEmpty (LinkQueue Q)//判断队列是否为空{ if(Q.front==Q.rear) return 1; return 0; } void BFS(ALGraph G,int v)//广度搜索 { int u; LinkQueue Q; InitQueue(Q); if(visited[v]==0) visited[v]=1; cout< EnQueue(Q,v); while(QueueEmpty(Q)!=1) { DeQueue(Q,u); ArcNode *z; z=(ArcNode*)malloc(sizeof(ArcNode)); if(!z) exit(-1); z=G.vertices[u].firstarc; /* for(int w=z->adjvex;w>=0;w=z->nextarc->adjvex) { if(visited[w]==0) { visited[w]=1; cout< EnQueue(Q,w); } }*/ int w; for(;z;z=z->nextarc) { w=z->adjvex; if(visited[w]==0) { visited[w]=1; cout< EnQueue(Q,w); } } } } } void BFSB (ALGraph G,int v)//广度搜索的边集 { int u; LinkQueue Q; InitQueue(Q); if(visited[v]==0) { visited[v]=1; EnQueue(Q,v); while(QueueEmpty(Q)!=1) { DeQueue(Q,u); ArcNode *r; r=(ArcNode*)malloc(sizeof(ArcNode)); if(!r) exit(-1); r=G.vertices[u].firstarc; int w; for(;r!=NULL;r=r->nextarc) { w=r->adjvex; if(visited[w]==0) { visited[w]=1; cout<"< EnQueue(Q,w); } } } } } int main() { int i; ALGraph G; CreateDG(G); int x; cout<<"请输入结点数:"; cin>>x; cout<<"邻接表为:"< for(int j=1;j<=x;j++) { cout< p=(ArcNode*)malloc(sizeof(ArcNode)); if(!p) exit(-1); p=G.vertices[j].firstarc; while(p) { cout< p=p->nextarc; } cout< } cout<<"请输入第一个要访问的结点序号:"< cin>>n; for( i=0;i<30;i++) visited[i]=0; cout<<"广度搜索:"< BFS(G,n); for( i=0;i<30;i++) visited[i]=0; cout< cout<<"边集:"< BFSB(G,n); for( i=0;i<30;i++) visited[i]=0; cout<<"深度搜索:"< DFS(G,n); for( i=0;i<30;i++) visited[i]=0; cout< cout<<"边集:"< DFSB(G,n); //system("pause"); return 0; } 3.对学生选课工程图进行拓扑排序. #include #include #define MAX_VEXTEX_NUM 20 #define M 20 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 typedef int ElemType; typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; }ArcNode; typedef struct VNode { int data; ArcNode *firstarc; }VNode,AdjList[MAX_VEXTEX_NUM]; typedef struct { AdjList vertices; int vexnum, arcnum; }ALGraph; typedef struct //构件栈 { ElemType *base; ElemType *top; int stacksize; }SqStack; void InitStack(SqStack *); //函数声明 int Pop(SqStack *, ElemType *); void Push(SqStack *,ElemType ); int StackEmpty(SqStack *); void CreatGraph(ALGraph *); void FindInDegree(ALGraph , int * ); void TopologicalSort(ALGraph ); void InitStack(SqStack *S)//初始化栈 { S->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!S->base) { printf("memory allocation failed, goodbye"); exit(1); } S->top=S->base; S->stacksize=STACK_INIT_SIZE; } int Pop(SqStack *S,ElemType *e)//出栈操作 { if(S->top==S->base) {return ERROR;} *e=*--S->top; //printf("%d\n",e); // return e; return 0; } void Push(SqStack *S,ElemType e)//进栈操作 {if(S->top-S->base>=S->stacksize) { S->base = (ElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType)); if(!S->base) { printf("memory allocation failed, goodbye"); exit(1); } S->top = S->base+S->stacksize; S->stacksize+=STACKINCREMENT; }*S->top++=e; } int StackEmpty(SqStack *S)//判断栈是否为空 { if(S->top==S->base) return OK; else return ERROR;} void CreatGraph(ALGraph *G)//构件图 {int m, n, i; ArcNode *p; printf("请输入顶点数和边数:"); scanf("%d%d",&G->vexnum,&G->arcnum); for (i = 1; i <= G->vexnum; i++) {G->vertices[i].data = i; G->vertices[i].firstarc = NULL; } for (i = 1; i <= G->arcnum; i++) //输入存在边的点集合 { printf("\n请输入存在边的两个顶点的序号:"); scanf("%d%d",&n,&m); while (n < 0 || n > G->vexnum || m < 0 || m > G->vexnum) {printf("输入的顶点序号不正确请重新输入:"); scanf("%d%d",&n,&m); } p = (ArcNode*)malloc(sizeof(ArcNode)); if (p == NULL) {printf("memory allocation failed,goodbey"); exit(1); } p->adjvex = m; p->nextarc = G->vertices[n].firstarc; G->vertices[n].firstarc = p; } printf("建立的邻接表为:\n"); //输出建立好的邻接表 for(i = 1; i <= G->vexnum; i++) { printf("%d",G->vertices[i].data); for(p = G->vertices[i].firstarc; p; p = p->nextarc) printf("%3d",p->adjvex); printf("\n"); }} void FindInDegree(ALGraph G, int indegree[])//求入度操作{ int i; for (i = 1; i <= G.vexnum; i++) { indegree[i] = 0; } for (i = 1; i <= G.vexnum; i++) {while (G.vertices[i].firstarc) {indegree[G.vertices[i].firstarc->adjvex]++; G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc; } } } void TopologicalSort(ALGraph G) //进行拓扑排序{ int indegree[M]; int i, k, n; int count = 0; ArcNode *p; SqStack S; FindInDegree(G, indegree); InitStack(&S); for (i = 1; i <= G.vexnum; i++) { printf("第%d个点的入度为%d \n", i, indegree[i]); } printf("\n"); for ( i = 1; i <= G.vexnum; i++) { if (!indegree[i]) Push(&S,i); } printf("进行拓扑排序输出顺序为:"); //输出结果while(!StackEmpty(&S)) { Pop(&S,&n); printf("%4d",G.vertices[n].data); count++; for (p = G.vertices[n].firstarc; p != NULL; p = p->nextarc) { k = p->adjvex; if (!(--indegree[k])) { Push(&S,k); } } }printf("\n"); if (count < G.vexnum) { printf("出现错误\n"); } else { printf("排序成功\n"); } } int main(void) //主函数 { ALGraph G; CreatGraph(&G); TopologicalSort(G); system("pause"); return 0; } 实验七查找 一、实验目的 1. 掌握查找的不同方法,并能用高级语言实现查找算法; 2. 熟练掌握二叉排序树的构造和查找方法。 3. 熟练掌握静态查找表及哈希表查找方法。 二、实验内容 设计一个读入一串整数,然后构造二叉排序树,进行查找。 三、实验步骤 1. 从空的二叉树开始,每输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中。 2. 在二叉排序树中查找某一结点。 3.用其它查找算法进行排序(课后自己做)。 四、实现提示 1. 定义结构 typedef struct node { int key; int other; struct node *lchild, *rchild; } bstnode; void inorder ( t ) { if (t!=Null) { inorder(t→lchild); printf(“%4d”, t→key); inorder(t→rchild); } } bstnode *insertbst(t, s) bstnode *s, *t; { bstnode *f, *p; p=t; while(p!=Null) { f=p; if (s→key= =p→key) return t; if (s→key 云南大学软件学院数据结构实验报告 (本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □ 学期:2010秋季学期 任课教师: 实验题目: 查找算法设计与实现 姓名: 王辉 学号: 20091120154 电子邮件: 完成提交时间: 2010 年 12 月 27 日 云南大学软件学院2010学年秋季学期 《数据结构实验》成绩考核表 学号:姓名:本人承担角色: 综合得分:(满分100分) 指导教师:年月日(注:此表在难度为C时使用,每个成员一份。) (下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%) 1 哈希表查找。根据全年级学生的姓名,构造一个哈希表,选择适当的哈希函数和解决冲突的方法,设计并实现插入、删除和查找算法。 熟悉各种查找算法的思想。 2、掌握查找的实现过程。 3、学会在不同情况下运用不同结构和算法求解问题。 4 把每个学生的信息放在结构体中: typedef struct //记录 { NA name; NA tel; NA add; }Record; 5 void getin(Record* a)函数依次输入学生信息 6 人名折叠处理,先将用户名进行折叠处理折叠处理后的数,用除留余数法构造哈希函数,并返回模值。并采用二次探测再散列法解决冲突。 7姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。将初始班级的通讯录信息存入文件。 二、【实验设计(Design)】(20%) (本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系) 1抽象数据类型的功能规格说明和结构体: #include 实验2 查找算法的实现和应用?实验目的 1. 熟练掌握静态查找表的查找方法; 2. 熟练掌握动态查找表的查找方法; 3. 掌握hash表的技术. ?实验内容 1.用二分查找法对查找表进行查找; 2.建立二叉排序树并对该树进行查找; 3.确定hash函数及冲突处理方法,建立一个hash表并实现查找。 程序代码 #include cout<<"Not present!"; } return 0; } 结果 二叉排序树 #include 暨南大学本科实验报告专用纸 课程名称数据结构实验成绩评定 实验项目名称习题6.51 指导教师孙世良 实验项目编号实验7 实验项目类型实验地点实验楼三楼机房学生姓名林炜哲学号2013053005 学院电气信息学院系专业软件工程 实验时间年月日午~月日午温度℃湿度(一)实验目的 熟悉和理解二叉树的结构特性; 熟悉二叉树的各种存储结构的特点及适用范围; 掌握遍历二叉树的各种操作及其实现方式。 (二)实验内容和要求 编写一个算法,输出以二叉树表示的算术表达式,若该表达式中含有括号,则应该在输出时添上。 (三)主要仪器设备 实验环境:Microsoft Visual Studio 2012 (四)源程序 #include if(t==' ') T=NULL; else{ if( !( T=(bitnode*)malloc(sizeof(bitnode)) ) ) exit(0); T->data=t; create(T->lchild); create(T->rchild); } } void middle_order(bitree &Node){ if(Node != NULL){ if((Node->data=='*'||Node->data=='/')&&(Node->lchild->data=='+'|| Node->lchild->data=='-')) printf("( "); middle_order(Node->lchild); if((Node->data=='*'||Node->data=='/')&&(Node->lchild->data=='+'|| Node->lchild->data=='-')) printf(") "); printf("%c ", Node->data); if((Node->data=='*'||Node->data=='/')&&(Node->rchild->data=='+'|| Node->rchild->data=='-')) printf("( "); middle_order(Node->rchild); if((Node->data=='*'||Node->data=='/')&&(Node->rchild->data=='+'|| Node->rchild->data=='-')) printf(") "); } } int main() { bitree y; printf("以先序遍历的方式输入二叉树:"); create(y); printf("输出表达式:"); middle_order(y); return 0; } (五)数据调试 实验七图的创建与遍历 实验目的: 通过上机实验进一步掌握图的存储结构及基本操作的实现。 实验内容与要求: 要求: ⑴能根据输入的顶点、边/弧的信息建立图; ⑵实现图中顶点、边/弧的插入、删除; ⑶实现对该图的深度优先遍历; ⑷实现对该图的广度优先遍历。 备注:单号基于邻接矩阵,双号基于邻接表存储结构实现上述操作。算法设计: #include . } void EnQueue(int e) { base[rear]=e; rear=(rear+1)%QUEUE_SIZE; } void DeQueue(int &e) { e=base[front]; front=(front+1)%QUEUE_SIZE; } public: int *base; int front; int rear; }; //图G中查找元素c的位置 int Locate(Graph G,char c) { for(int i=0;i 数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include 实验八内部排序 一、实验目的 1、掌握内部排序的基本算法; 2、分析比较内部排序算法的效率。 二、实验内容和要求 1. 运行下面程序: #include (*ht)[i].RChild = 0; } for(i=n+1;i<=m;i++){ (*ht)[i].weight = 0; (*ht)[i].LChild = 0; (*ht)[i].parent = 0; (*ht)[i].RChild = 0; } for(i=n+1;i<=m;i++){ YLX_select(ht,i-1,&s1,&s2); (*ht)[s1].parent=i; (*ht)[s2].parent=i; (*ht)[i].LChild=s1; (*ht)[i].RChild=s2; (*ht)[i].weight=(*ht)[s1].weight+(*ht)[s2].weight ; } } void YLX_outputHuffman(HuffmanTree HT, int m){ if(m!=0){ YLX_outputHuffman(HT,HT[m].LChild); if(!HT[m].LChild&&!HT[m].RChild)printf("%c \t", HT[m].data); YLX_outputHuffman(HT,HT[m].RChild); } } void YLX_CrtHuffmanCode(HuffmanTree *ht, HuffmanCode *hc, int n){ char *cd; int i; unsigned int c; int start; int p; hc=(HuffmanCode *)malloc((n+1)*sizeof(char *)); cd=(char * )malloc(n * sizeof(char )); cd[n-1]='\0'; for(i=1;i<=n;i++){ start=n-1; for(c=i,p=(*ht)[i].parent; p!=0; c=p,p=(*ht)[p].parent) if( (*ht)[p].LChild == c) cd[--start]='0'; else cd[--start]='1'; hc[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(hc[i],&cd[start]); } free(cd); for(i=1;i<=n;i++) printf("%c编码为%s\n",(*ht)[i].data,hc[i]); } void main() { HuffmanTree HT; HuffmanCode HC; int n; int m; printf("*******袁丽湘*******"); printf("\n"); printf("输入叶子节点的个数:" ); scanf("%d",&n); YLX_CrtHuffmanTree(&HT,n); m=2*n-1;printf("中序输出哈夫曼树叶子节点:\n"); YLX_outputHuffman(HT,m); printf("\n"); YLX_CrtHuffmanCode(&HT,&HC,n); } 六、运行结果截图 姓名: 学号: 班级: 2010年12月15日 实验一线性表的应用 【实验目的】 1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。、; 2、以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点; 3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现; 4、通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的 应用和链表的建立等各种基本操作)。 【实验内容】 约瑟夫问题的实现:n只猴子要选猴王,所有的猴子按1,2,…,n编号围坐一圈,从第一号开始按1,2…,m报数,凡报到m号的猴子退出圈外,如此次循环报数,知道圈内剩下一只猴子时,这个猴子就是猴王。编写一个程序实现上述过程,n和m由键盘输入。【实验要求】 1、要求用顺序表和链表分别实现约瑟夫问题。 2、独立完成,严禁抄袭。 3、上的实验报告有如下部分组成: ①实验名称 ②实验目的 ③实验内容:问题描述:数据描述:算法描述:程序清单:测试数据 算法: #include 长春大学计算机学院网络工程专业 数据结构实验报告 实验名称:实验二栈和队列的操作与应用 班级:网络14406 姓名:李奎学号:041440624 实验地点:日期: 一、实验目的: 1.熟练掌握栈和队列的特点。 2.掌握栈的定义和基本操作,熟练掌握顺序栈的操作及应用。 3.掌握链队的入队和出队等基本操作。 4.加深对栈结构和队列结构的理解,逐步培养解决实际问题的编程能力。 二、实验内容、要求和环境: 注:将完成的实验报告重命名为:班级+学号+姓名+(实验二),(如:041340538张三(实验二)),发邮件到:ccujsjzl@https://www.doczj.com/doc/a111345319.html,。提交时限:本次实验后24小时之内。 阅读程序,完成填空,并上机运行调试。 1、顺序栈,对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 (1)文件SqStackDef. h 中实现了栈的顺序存储表示 #define STACK_INIT_SIZE 10 /* 存储空间初始分配量*/ #define STACKINCREMENT 2 /* 存储空间分配增量*/ typedef struct SqStack { SElemType *base; /* 在栈构造之前和销毁之后,base 的值为NULL */ SElemType *top; /* 栈顶指针*/ int stacksize; /* 当前已分配的存储空间,以元素为单位*/ }SqStack; /* 顺序栈*/ (2)文件SqStackAlgo.h 中实现顺序栈的基本操作(存储结构由SqStackDef.h 定义) Status InitStack(SqStack &S) { /* 构造一个空栈S */ S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); /* 存储分配失败*/ S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } int StackLength(SqStack S) { // 返回S 的元素个数,即栈的长度, 编写此函数 云南大学 数据结构实验报告 第三次实验 学号: 姓名: 一、实验目的 1、复习结构体、指针; 2、掌握链表的创建、遍历等操作; 3、了解函数指针。 二、实验内容 1、(必做题)每个学生的成绩信息包括:学号、语文、数学、英语、总分、加权平均分;采用链表存储若干学生的成绩信息;输入学生的学号、语文、数学、英语成绩;计算学生的总分和加权平均分(语文占30%,数学占50%,英语占20%);输出学生的成绩信息。 三、算法描述 (采用自然语言描述) 首先创建链表存储n个学生的成绩信息,再通过键盘输入学生的信息,创建指针p所指结点存储学生的成绩信息,从键盘读入学生人数,求出学生的总分和加权平均分,输出结果。 四、详细设计 (画出程序流程图) 五、程序代码 (给出必要注释) #include 邻接矩阵的实现 1. 实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现2. 实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历3.设计与编码MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template int vertexNum, arcNum; }; #endif MGraph.cpp #include 2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨 实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。 三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;i 课程实验报告课程名称:数据结构 专业班级:信安 学号: 姓名: 指导教师: 报告日期:2015.4.5 计算机科学与技术学院 目录 1 课程实验概述 (1) 2 实验一基于顺序结构的线性表实现 2.1 问题描述 (2) 2.2 系统设计 (2) 2.3 系统实现 (7) 2.4 效率分析 (11) 3 实验二基于链式结构的线性表实现 3.1 问题描述 (12) 3.2 系统设计 (12) 3.3 系统实现 (14) 3.4 效率分析 (22) 4 实验三基于二叉链表的二叉树实现 4.1 问题描述 (23) 4.2 系统设计 (23) 4.3 系统实现 (32) 4.4 效率分析 (43) 5 实验总结与评价 (45) 1 课程实验概述 上机实验是对学生的一种全面综合训练,是与课堂听课、自学和练习相辅相成的必不可少的一个教学环节。实验目的着眼于原理与应用的结合,使学生学会如何把书上的知识用语解决实际问题,能够理解和运用常用的数据结构,如线性表、栈、队列、树、图、查找表等,并在此基础上建立相应的算法;通过上机实验使学生了解算法和程序的区别,培养学生把算法转换为程序的能力,提高学生解决实际问题的能力;学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术。 2 实验一基于顺序结构的线性表实现 2.1 问题描述 编写一个程序,实现顺序表的各种基本运算,并在此基础上完成以下功能: 1) 初始化顺序表; 2) 释放顺序表; 3) 判断顺序表L是否为空; 4) 输出顺序表L的长度; 5) 输出顺序表L的第i个元素; 6) 输出元素e的位置; 7) 输出元素e的前一个元素; 8) 输出元素e的后一个元素; 9) 在第i个元素位置上插入f元素; 10) 删除L的第i个元素; 11) 输出顺序表L; 12) 保存顺序表L的数据。 2.2 系统设计 1、数据类型 顺序表:typedef struct { ElemType * elem; //线性表首地址 int length; //线性表当前长度 int listsize; //线性表最大长度 }SqList; 数据类型:int(可以在头文件中更改数据类型) 输入形式:文件读取、键盘输入 输入范围:-2^15~2^16 2、函数返回状态 判断为真:TRUE 0 判断为假:FALSE -1 函数正确执行:OK -2 函数执行错误:ERROR -3 元素不存在:NOTEXIST -4 内存分配溢出:OVERFLOW -5 图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template 天津科技大学 2015—2016学年第2学期数据结构实验任务书 课程名称:数据结构实验学时: 2 实验题目:线性表的基本操作 实验环境: Visual C++ 实验目的: 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 实验内容: 定义一个包含学生信息(学号,姓名,成绩)的顺序表和链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据姓名进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 实验提示: 学生信息的定义: typedef struct { char no[8]; //8位学号 char name[20]; //姓名 int score; //成绩 }Student; 顺序表的定义 typedef struct { Student *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqList; 链表的定义: typedef struct LNode{ Student data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; 实验要求: (1) 程序要添加适当的注释,程序的书写要采用缩进格式。 (2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。 (3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。 (4) 根据实验报告模板详细书写实验报告,在实验报告中给出链表根据姓名进行查找的算法和插入算法的流程图。 (5) 以班为单位实验周周五上传源程序和实验报告。顺序表的源程序保存为SqList.cpp,链表的源程序保存为LinkList.cpp,实验报告命名为:实验报告1.doc。源程序和实验报告压缩为一个文件(如果定义了头文件则一起压缩),按以下方式命名:学号姓名.rar,如07081211薛力.rar。 数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include >验目的 掌握顺序栈的基本操作:初始化栈、判栈空否、入栈、出栈、取栈顶数据元素等运算以及程序实现方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)分析问题的要求,编写和调试完成程序。 (3)保存和打印出程序的运行结果,并分析程序的运行结果。 3.实验内容 利用栈的基本操作实现一个判断算术表达式中包含圆括号、方括号是否正确配对的程序。具体完成如下: (1)定义栈的顺序存取结构。 (2)分别定义顺序栈的基本操作(初始化栈、判栈空否、入栈、出栈等)。 (3)定义一个函数用来判断算术表达式中包含圆括号、方括号是否正确配对。其中,括号配对共有四种情况:左右括号配对次序不正确;右括号多于左括号;左括号多于右括号;左右括号匹配正确。 (4)设计一个测试主函数进行测试。 (5)对程序的运行结果进行分析。 实验代码: #include < > #define MaxSize 100 typedef struct { ??? int data[MaxSize]; ??? int top; }SqStack; void InitStack(SqStack *st) 验目的 (1)进一步掌握指针变量的用途和程序设计方法。 (2)掌握二叉树的结构特征,以及链式存储结构的特点及程序设计方法。 (3)掌握构造二叉树的基本方法。 (4)掌握二叉树遍历算法的设计方法。 3.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)掌握一个实际二叉树的创建方法。 (3)掌握二叉链存储结构下二叉树操作的设计方法和遍历操作设计方法。 4.实验内容 (1)定义二叉链存储结构。 实验难度: A □ B □ C 学期:2017秋季学期 任课教师: 储星 实验题目: 查找算法的设计与实现 组员及组长: 承担工作: 联系电话: 电子邮件: 完成提交时间: 2018 年 12 月 29 日 一、【实验构思(Conceive)】(10%) (本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析) 二叉排序树的查找算法及算法原理:对给定的二叉排序树,如果想知道某元素是否在其中出现,可以和根结点比较,如果相等结束;如果不等,若比其大,进入右子树;否则进入左子树;继续按照上面的方法,直到出现相等或者到某分支结束为止,返回查找信息。 哈希表的查找算法及其原理:给定K值,根据造表时设定的哈希函数求得哈希地址,若表中此位置上没有记录,则查找不成功;否则比较关键字,若和给定值相等,则查找成功;否则根据造表时设定的处理冲突的方法找到“下一地址”,直至哈希表中某个位置为“空”或者表中所记录的关键字等于给定值时为止。 数据结构算法的知识:表的定义、表项的表示、表的存储结构、哈希表的定义、哈希函数的构造方法、哈希表查找处理冲突的办法。 面向对象的程序设计相关知识:C基本语法知识、类的定义、对象的生成调用、变量的传递。 二、【实验设计(Design)】(20%) (本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等) 抽象数据类型: typedef int KeyType; typedef struct { const char *name; int namenum; }Name; typedef struct { Name data; int pos; }HashTable; typedef struct Hash { 附录A 实验报告 课程:数据结构(c语言)实验名称:图的建立、基本操作以及遍历系别:数字媒体技术实验日期: 12月13号 12月20号 专业班级:媒体161 组别:无 姓名:学号: 实验报告内容 验证性实验 一、预习准备: 实验目的: 1、熟练掌握图的结构特性,熟悉图的各种存储结构的特点及适用范围; 2、熟练掌握几种常见图的遍历方法及遍历算法; 实验环境:Widows操作系统、VC6.0 实验原理: 1.定义: 基本定义和术语 图(Graph)——图G是由两个集合V(G)和E(G)组成的,记为G=(V,E),其中:V(G)是顶点(V ertex)的非空有限集E(G)是边(Edge)的有限集合,边是顶点的无序对(即:无方向的,(v0,v2))或有序对(即:有方向的, 无向图中顶点V i的度TD(V i)是邻接矩阵A中第i行元素之和有向图中, 顶点V i的出度是A中第i行元素之和 顶点V i的入度是A中第i列元素之和 邻接表 实现:为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(有向图中指以Vi为尾的弧) 特点: 无向图中顶点Vi的度为第i个单链表中的结点数有向图中 顶点Vi的出度为第i个单链表中的结点个数 顶点Vi的入度为整个单链表中邻接点域值是i的结点个数 逆邻接表:有向图中对每个结点建立以Vi为头的弧的单链表。 图的遍历 从图中某个顶点出发访遍图中其余顶点,并且使图中的每个顶点仅被访问一次过程.。遍历图的过程实质上是通过边或弧对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用的存储结构。图的遍历有两条路径:深度优先搜索和广度优先搜索。当用邻接矩阵作图的存储结构时,查找每个顶点的邻接点所需要时间为O(n2),n为图中顶点数;而当以邻接表作图的存储结构时,找邻接点所需时间为O(e),e 为无向图中边的数或有向图中弧的数。 实验内容和要求: 选用任一种图的存储结构,建立如下图所示的带权有向图: 要求:1、建立边的条数为零的图;数据结构实验七 查找
数据结构实验报告七查找、
数据结构实验
数据结构实验7实验报告
数据结构实验七图的创建与遍历
数据结构实验报告
数据结构实验八内部排序
数据结构实验七
数据结构实验报告
数据结构实验
数据结构实验报告[3]
数据结构实验报告图实验
数据结构实验报告及心得体会
数据结构课程实验报告(7)
数据结构实验报告图实验
数据结构实验1
数据结构实验报告全集
云南大学数据结构实验7
数据结构实验报告(图)