数据结构第三次实验
来源:互联网 发布:飞控算法工程师培训 编辑:程序博客网 时间:2024/06/07 20:08
不多说了,直接上代码
1000+行垃圾代码(.cpp文件)
#include <stdio.h>#include <stdlib.h>#include <string.h>#define max 100#define VertexData char#define VertexType char#define EdgeData intusing namespace std;//邻接矩阵typedef struct{ int edge[max][max]; int n;//顶点数 int e;//边数}st;st G,G0,G1;//邻接表typedef struct node{ int adivex; EdgeData cost; struct node *next;}EdgeNode;typedef struct{ VertexData vertex[max]; EdgeNode *firstedge;}VertexNode;typedef struct{ VertexNode vexlist[max]; int n,e;}AdjGraph;AdjGraph A,A0,A1;//邻接多重表typedef struct EBox{ char mark;//N和Y int ivex,jvex; struct EBox *ilink,*jlink; int weight;}EBox;typedef struct VexBox{ VertexType data[max]; EBox *firstedge;}VexBox;typedef struct{ VexBox adjmulist[max]; int vexnum,edgenum;}AMLGragh;AMLGragh S,S0,S1;//栈typedef struct { int top; int data[max];}stack;//队列typedef struct{ int top; int bottom; int data[max];}QUEUE;bool visited[max];int dfn[max];void CreateMGraph();//邻接矩阵void CreateGraph();//邻接表void CreateAMLGragh();//邻接多重表void MGraphtoGraph();//邻接矩阵转邻接表void GraphtoMGraph();//邻接表转邻接矩阵void MGraphtoAMLGraph();//邻接矩阵转邻接多重表void AMLGraphtoMGraphto();//邻接多重表转邻接矩阵void GraphtoAMLGraph();//邻接表转邻接多重表void AMLGraphtoGraph();//邻接多重表转邻接表void DFSMGraph();//递归深度优先搜索邻接矩阵void DFS1(int i,int count);//递归遍历邻接矩阵void DFSGraph();//递归深度优先搜索邻接表void DFS2(int i,int count);//递归遍历邻接表void DFSNMGraph();//非递归深度优先搜索邻接矩阵void DFS3(int v0);//非递归遍历邻接矩阵int FirstAdivertex(int v0);int AnotherFirstAdivertex(int v0);int NextAdjVertex(int v0,int w);int AnotherNextAdjVertex(int v0,int w);void initstack(stack **s);void push(stack *s,int v);int empty(stack *s);int pop(stack *s,int *v);void visit(int v0);void Anothervisit(int v0);void DFSNGraph();//非递归深度优先搜索邻接表void DFSAMLGraph();//递归深度优先搜索多重邻接表void DFS5(int i);//递归遍历多重邻接表void DFSNAMLGraph();//非递归深度优先搜索多重邻接表void DFS6(int v);//非递归遍历多重邻接表int AnotherFirstAdivertex1(int v);int AnotherNextAdjVertex1(int v,int w);void BFSMGraph();//广度优先搜索邻接矩阵void BFS1(int k);//广度遍历邻接矩阵void MAKENULL(QUEUE *Q);//置空队列void ENQUEUE(int k,QUEUE &Q);//压入队列bool Empty(QUEUE Q);//判断队列是否为空int DEQUEUE(QUEUE *Q);//扔出队列中的最低端元素void BFSGraph();//广度优先搜索邻接表void BFS2(int k);//广度遍历邻接表void BFSAMLGraph();//广度优先搜索邻接多重表void BFS3(int k);//广度遍历邻接多重表int main(){ CreateMGraph(); CreateGraph(); CreateAMLGragh(); MGraphtoGraph(); GraphtoMGraph(); MGraphtoAMLGraph(); AMLGraphtoMGraphto(); GraphtoAMLGraph(); AMLGraphtoGraph(); DFSMGraph(); DFSGraph(); DFSNMGraph(); DFSNGraph(); DFSAMLGraph(); DFSNAMLGraph(); BFSMGraph(); BFSGraph(); BFSAMLGraph(); return 0;}void CreateMGraph(){ FILE *fp; fp = fopen("D:\\linjiejuzhen.txt","r"); if(!fp) { printf("error!\n"); exit(0); } fscanf(fp,"%d",&G.n); fscanf(fp,"%d",&G.e); printf("矩阵的长度为%d,邻接矩阵的边数为%d\n",G.n,G.e); for(int i=1;i<G.n;i++) { G.edge[i][i] = 0; for(int j=0;j<i;j++) { fscanf(fp,"%d",&G.edge[i][j]); G.edge[j][i] = G.edge[i][j]; } } fclose(fp); for(int i=0;i<G.n;i++) { for(int j=0;j<G.n;j++) { if(G.edge[i][j]<10) printf(" %d ",G.edge[i][j]); if(G.edge[i][j]>=10) printf("%d ",G.edge[i][j]); } printf("\n"); }}void CreateGraph(){ int tail,head,weight; FILE *fp; fp = fopen("D:\\linjiebiao.txt","r"); if(!fp) { printf("error!\n"); exit(0); } fscanf(fp,"%d",&A.n); fscanf(fp,"%d",&A.e); printf("矩阵的长度为%d,邻接表的边数有%d\n",A.n,A.e); for(int i=0;i<A.n;i++) { fscanf(fp,"%s",A.vexlist[i].vertex); A.vexlist[i].firstedge = NULL; } for(int i=0;i<A.e;i++) { fscanf(fp,"%d",&tail); fscanf(fp,"%d",&head); fscanf(fp,"%d",&weight); EdgeNode *p = new EdgeNode; p->adivex = head; p->cost = weight; p->next = A.vexlist[tail].firstedge; A.vexlist[tail].firstedge = p; p = new EdgeNode; p->adivex = tail; p->cost = weight; p->next = A.vexlist[head].firstedge; A.vexlist[head].firstedge = p; } fclose(fp); for(int i=0;i<A.n;i++) { EdgeNode *q = new EdgeNode; q = A.vexlist[i].firstedge; printf("[%s]",A.vexlist[i].vertex); while(q!=NULL) { if(q->cost!=0) printf("-->%d",q->adivex); q = q->next; } printf("\n"); }}void CreateAMLGragh(){ int i,j,k,z; FILE *fp = fopen("D:\\linjieduochongbiao.txt","r"); if(!fp) { printf("error!\n"); exit(0); } fscanf(fp,"%d",&S.vexnum); fscanf(fp,"%d",&S.edgenum); printf("矩阵的长度为%d,边的数量为%d\n",S.vexnum,S.edgenum); for(i=0;i<S.vexnum;i++){ fscanf(fp,"%s",&S.adjmulist[i].data); S.adjmulist[i].firstedge = NULL; } for(k=0;k<S.edgenum;k++) { fscanf(fp,"%d",&i); fscanf(fp,"%d",&j); fscanf(fp,"%d",&z); EBox *p = new EBox; p->ivex = i; p->jvex = j; p->weight = z; p->mark = 'N'; p->ilink = S.adjmulist[i].firstedge; p->jlink = S.adjmulist[j].firstedge; S.adjmulist[i].firstedge = S.adjmulist[j].firstedge = p; } fclose(fp); EBox *p = new EBox; for(i=0;i<S.vexnum;i++) { p = S.adjmulist[i].firstedge; printf("[%s.link]",S.adjmulist[i].data); while(p!=NULL) { if(i==p->ivex) { if(p->weight!=0) printf(" %d----%d",i,p->jvex); p=p->ilink; } else if(i==p->jvex) { if(p->weight!=0) printf(" %d----%d",i,p->ivex); p=p->jlink; } } printf("\n"); }}void MGraphtoGraph(){ printf("邻接矩阵转换为邻接表\n"); char c = 'v'; for(int i=0;i<G.n;i++)//初始化邻接表 { sprintf(A0.vexlist[i].vertex,"%c%d",c,i); A0.vexlist[i].firstedge = NULL; } for(int i=0;i<G.n;i++)//邻接矩阵转换邻接表 { for(int j=0;j<G.n;j++) { EdgeNode *p = new EdgeNode; p->adivex = i; p->cost = G.edge[i][j]; p->next = A0.vexlist[i].firstedge; A0.vexlist[i].firstedge = p; p = new EdgeNode; p->adivex = j; p->cost = G.edge[i][j]; p->next = A0.vexlist[j].firstedge; A0.vexlist[j].firstedge = p; } } for(int i=0;i<A.n;i++) { EdgeNode *q = new EdgeNode; q = A.vexlist[i].firstedge; printf("[%s]",A.vexlist[i].vertex); while(q!=NULL) { if(q->cost!=0) printf("-->%d",q->adivex); q = q->next; } printf("\n"); }}void GraphtoMGraph(){ //初始化G0 G0.e = A.e; G0.n = A.n; int a; printf("邻接表转换为邻接矩阵\n"); for(int i=0;i<G0.n;i++) for(int j=0;j<G0.n;j++) G0.edge[i][j] = 0; EdgeNode *p = new EdgeNode; for(int i=0;i<A.n;i++) { p = A.vexlist[i].firstedge; while(p!=NULL){ a = p->adivex; G0.edge[i][a] = p->cost; p = p->next; } } for(int i=0;i<G0.n;i++) { for(int j=0;j<G0.n;j++) { if(G0.edge[i][j]<10) printf(" %d ",G0.edge[i][j]); if(G0.edge[i][j]>=10) printf("%d ",G0.edge[i][j]); } printf("\n"); }}void MGraphtoAMLGraph(){ printf("邻接矩阵转邻接多重表\n"); char c = 'v'; S0.edgenum = G.e; S0.vexnum = G.n; for(int i=0;i<G.n;i++) { sprintf(S0.adjmulist[i].data,"%c%d",c,i); S0.adjmulist[i].firstedge = NULL; } for(int i=1;i<G.n;i++) { for(int j=0;j<i;j++) { EBox *p = new EBox; p->ivex = i; p->jvex = j; p->weight = G.edge[i][j]; p->mark = 'N'; p->ilink = S0.adjmulist[i].firstedge; p->jlink = S0.adjmulist[j].firstedge; S0.adjmulist[i].firstedge = S0.adjmulist[j].firstedge = p; } } EBox *p = new EBox; for(int i=0;i<S0.vexnum;i++) { p = S0.adjmulist[i].firstedge; printf("[%s.link]",S0.adjmulist[i].data); while(p!=NULL) { if(i==p->ivex) { if(p->weight!=0) printf(" %d----%d",i,p->jvex); p=p->ilink; } else if(i==p->jvex) { if(p->weight!=0) printf(" %d----%d",i,p->ivex); p=p->jlink; } } printf("\n"); }}void AMLGraphtoMGraphto(){ printf("邻接多重表转邻接矩阵\n"); G1.e = S.edgenum; G1.n = S.vexnum; for(int i=0;i<G1.n;i++) for(int j=0;j<G1.n;j++) G1.edge[i][j] = 0; for(int i=0;i<S.vexnum;i++) { EBox *p = new EBox; p = S.adjmulist[i].firstedge; while(p!=NULL) { if(i==p->ivex) { int j = p->jvex; G1.edge[i][j] = p->weight; G1.edge[j][i] = p->weight; p=p->ilink; } else if(i==p->jvex) { int j = p->ivex; G1.edge[i][j] = p->weight; G1.edge[j][i] = p->weight; p=p->jlink; } } } for(int i=0;i<G1.n;i++) { for(int j=0;j<G1.n;j++) { if(G1.edge[i][j]<=9) printf(" %d ",G1.edge[i][j]); else if(G1.edge[i][j]>9) printf("%d ",G1.edge[i][j]); } printf("\n"); }}void GraphtoAMLGraph(){ char c = 'v'; int j; printf("邻接表转邻接多重表\n"); S1.edgenum = A.e; S1.vexnum = A.n; for(int i=0;i<S1.vexnum;i++) { sprintf(S1.adjmulist[i].data,"%c%d",c,i); S1.adjmulist[i].firstedge = NULL; } for(int i=0;i<A.n;i++) { EdgeNode *q = new EdgeNode; q = A.vexlist[i].firstedge; while(q!=NULL) { j = q->adivex; if(j>i) { EBox *p = new EBox; p->ivex = i; p->jvex = j; p->weight = q->cost; p->mark = 'N'; p->ilink = S1.adjmulist[i].firstedge; p->jlink = S1.adjmulist[j].firstedge; S1.adjmulist[i].firstedge = S1.adjmulist[j].firstedge = p; } q = q->next; } } for(int i=0;i<S1.vexnum;i++) { EBox *p = new EBox; p = S1.adjmulist[i].firstedge; printf("[%s.link]",S1.adjmulist[i].data); while(p!=NULL) { if(i==p->ivex) { if(p->weight!=0) printf(" %d----%d",i,p->jvex); p=p->ilink; } else if(i==p->jvex) { if(p->weight!=0) printf(" %d----%d",i,p->ivex); p=p->jlink; } } printf("\n"); }}void AMLGraphtoGraph(){ printf("邻接多重表转邻接表\n"); char c = 'v'; A1.e = S.edgenum; A1.n = S.vexnum; for(int i=0;i<A1.n;i++) { sprintf(A1.vexlist[i].vertex,"%c%d",c,i); A1.vexlist[i].firstedge = NULL; } EBox *p = new EBox; for(int i=0;i<S.vexnum;i++) { p = S.adjmulist[i].firstedge; while(p!=NULL) { if(i==p->ivex){ int j = p->jvex; if(j>i){ EdgeNode *q = new EdgeNode; q->adivex = j; q->cost = p->weight; q->next = A1.vexlist[i].firstedge; A1.vexlist[i].firstedge = q; q = new EdgeNode; q->adivex = i; q->cost = p->weight; q->next = A1.vexlist[j].firstedge; A1.vexlist[j].firstedge = q; } p = p->ilink; } else if(i==p->jvex){ int j = p->ivex; if(j>i){ EdgeNode *q = new EdgeNode; q->adivex = j; q->cost = p->weight; q->next = A1.vexlist[i].firstedge; A1.vexlist[i].firstedge = q; q = new EdgeNode; q->adivex = i; q->cost = p->weight; q->next = A1.vexlist[j].firstedge; A1.vexlist[j].firstedge = q; } p = p->jlink; } } } for(int i=0;i<A1.n;i++) { EdgeNode *p = new EdgeNode; p = A1.vexlist[i].firstedge; printf("[%s]",A1.vexlist[i].vertex); while(p!=NULL) { if(p->cost!=0) printf("-->%d",p->adivex); p = p->next; } printf("\n"); }}void DFSMGraph(){ printf("递归遍历邻接矩阵\n"); int count = 1; for(int i=0;i<G.n;i++) visited[i] = false; for(int i=0;i<G.n;i++) if(!visited[i]) DFS1(i,count);printf("\n");}void DFS1(int i,int count){ int j; printf("v%d ",i); visited[i] = true; dfn[i] = count; count++; for(j=0;j<G.n;j++) if((G.edge[i][j]>0)&&!visited[i]) DFS1(j,count);}void DFSGraph(){ printf("递归遍历邻接表\n"); int count = 1; for(int i=0;i<A.n;i++) visited[i] = false; for(int i=0;i<A.n;i++) if(!visited[i]) DFS2(i,count);}void DFS2(int i,int count){ EdgeNode *p = new EdgeNode; printf("%s ",A.vexlist[i].vertex); visited[i] = true; dfn[i] = count++; p = A.vexlist[i].firstedge; while(p){ if(!visited[p->adivex]) DFS2(p->adivex,count); p = p->next; }}void DFS3(int v0){ int v,w; stack *s; initstack(&s); push(s,v0); while(empty(s)) { pop(s,&v); if(!visited[v]) { visit(v); visited[v] = true; } w = FirstAdivertex(v); while(w!=-1) { if(!visited[w]) push(s,w); w = NextAdjVertex(v,w); } }}void DFS4(int v0){ int v,w; stack *s; initstack(&s); push(s,v0); while(empty(s)) { pop(s,&v); if(!visited[v]) { Anothervisit(v); visited[v] = true; } w = AnotherFirstAdivertex(v); while(w!=-1) { if(!visited[w]) push(s,w); w = AnotherNextAdjVertex(v,w); } }}void DFSNMGraph(){ for(int i=0;i<G.n;i++) visited[i] = false; printf("\n非递归遍历邻接矩阵\n"); int v; for(v=0;v<G.n;v++) if(!visited[v]) DFS3(v); printf("\n");}void DFSNGraph(){ for(int i=0;i<A.n;i++) visited[i] = false; printf("非递归遍历邻接表\n"); int v; for(v=0;v<A.n;v++){ if(!visited[v]) DFS4(v); } printf("\n");}int FirstAdivertex(int v0){ int j; for(j=0;j<G.n;j++) if(G.edge[v0][j]!=0) return j; return -1;}int AnotherFirstAdivertex(int v0){ int j=0; EdgeNode *p = new EdgeNode; p = A.vexlist[v0].firstedge; while(p!=NULL){ if(p->cost!=0) return j; j++; p = p->next; } return -1;}int NextAdjVertex(int v0,int w){ int j; for(j=w+1;j<G.n;j++) if(G.edge[v0][w]!=0) return j; return -1;}int AnotherNextAdjVertex(int v0,int w){ EdgeNode *p = new EdgeNode; p = A.vexlist[v0].firstedge; while(p!=NULL) { if(p->adivex==w&&p->next!=NULL) return p->next->adivex; p = p->next; } return -1;}void initstack(stack **s){ *s = (stack *)malloc(sizeof(stack)); memset(*s,0,sizeof(**s)); (*s)->top = -1;}void push(stack *s,int v){ s->top++; s->data[s->top] = v;}int empty(stack *s){ if(s->top==-1) return 0; else return 1;}int pop(stack *s,int *v){ if(!empty(s)) return 0; else{ *v = s->data[s->top]; s->top--; return 1; }}void visit(int v0){ printf("v%d ",v0);}void Anothervisit(int v0){ printf("%s ",A.vexlist[v0].vertex);}void DFSAMLGraph(){ printf("递归遍历多重邻接表\n"); int i; for(i=0;i<S.vexnum;i++) visited[i] = false; for(i=0;i<S.vexnum;i++) if(!visited[i]) DFS5(i);}void DFS5(int i){ int j; EBox *p = new EBox; printf("%s ",S.adjmulist[i].data); visited[i] = true; p = S.adjmulist[i].firstedge; while(p){ j = p->ivex == i ? p->jvex : p->ivex; if(!visited[j]) DFS5(j); p = p->ivex == i ? p->ilink : p->jlink; }}void DFSNAMLGraph(){ printf("\n非递归遍历多重邻接表\n"); for(int i=0;i<S.vexnum;i++) visited[i] = false; int v; for(v=0;v<S.vexnum;v++){ if(!visited[v]) DFS6(v); } printf("\n");}void DFS6(int v0){ int v,w; stack *s; initstack(&s); push(s,v0); while(empty(s)) { pop(s,&v); if(!visited[v]) { printf("%s ",S.adjmulist[v].data); visited[v] = true; } w = AnotherFirstAdivertex1(v); while(w!=-1) { if(!visited[w]) push(s,w); w = AnotherNextAdjVertex1(v,w); } }}int AnotherNextAdjVertex1(int v0,int w){ int v=v0; EBox *p = new EBox; p = S.adjmulist[v0].firstedge; while(p->ilink!=NULL&&p->jlink!=NULL) { if(p->ivex==v){ if(w==p->jvex) { p = p->ilink; if(p->ivex==v) return p->jvex; else return p->ivex; }else{ p = p->ilink; } } else{ if(w==p->ivex) { p = p->jlink; if(p->jvex==v) return p->ivex; else return p->jvex; }else p = p->jlink; } } return -1;}int AnotherFirstAdivertex1(int v0){ int j,k; EBox *p = new EBox; p = S.adjmulist[v0].firstedge; j = p->jvex; while(p!=NULL) { k = p->ivex; if(p->weight!=0) return j; //j = p->ivex == k ? p->jvex : p->ivex; p = p->ivex == k ? p->ilink : p->jlink; } return -1;}void BFSMGraph(){ printf("广度遍历邻接矩阵\n"); for(int i=0;i<G.n;i++) visited[i] = false; for(int i=0;i<G.n;i++) if(!visited[i]) BFS1(i);}void BFS1(int k){ int i,j; QUEUE Q; MAKENULL(&Q); printf("v%d ",k); visited[k] = true; ENQUEUE(k,Q); while(!Empty(Q)) { i = DEQUEUE(&Q); for(j=0;j<G.n;j++) { if(G.edge[i][j]!=0&&!visited[j]) { printf("v%d ",j); visited[j] = true; ENQUEUE(j,Q); } } }}void MAKENULL(QUEUE *Q){ Q->bottom = Q->top = 0;}void ENQUEUE(int k,QUEUE &Q){ Q.data[Q.top] = k; Q.top++;}bool Empty(QUEUE Q){ return Q.bottom==Q.top;}int DEQUEUE(QUEUE *Q){ int i = Q->data[Q->bottom]; Q->bottom++; return i;}void BFSGraph(){ printf("\n广度优先搜索邻接表\n"); for(int i=0;i<A.n;i++) visited[i] = false; for(int i=0;i<A.n;i++) if(!visited[i]) BFS2(i);}void BFS2(int k){ int i; EdgeNode *p = new EdgeNode; QUEUE Q; MAKENULL(&Q); ENQUEUE(k,Q); printf("%s ",A.vexlist[k].vertex); visited[k] = true; while(!Empty(Q)) { i = DEQUEUE(&Q); p = A.vexlist[i].firstedge; while(p){ if(!visited[p->adivex]){ printf("%s ",A.vexlist[p->adivex].vertex); visited[p->adivex] = true; ENQUEUE(p->adivex,Q); } p = p->next; } }}void BFSAMLGraph(){ printf("\n广度优先搜索邻接多重表\n"); for(int i=0;i<S.vexnum;i++) visited[i] = false; for(int i=0;i<S.vexnum;i++) if(!visited[i]) BFS3(i);}void BFS3(int k){ int i,w; EBox *p = new EBox; QUEUE Q; MAKENULL(&Q); visited[k] = true; ENQUEUE(k,Q); printf("%s ",S.adjmulist[k].data); while(!Empty(Q)){ i = DEQUEUE(&Q); if(!visited[i]){ printf("%s ",S.adjmulist[i].data); visited[i] = true; } w = AnotherFirstAdivertex1(i); while(w!=-1) { if(!visited[w]) ENQUEUE(w,Q); w = AnotherNextAdjVertex1(i,w); } }}
读入的文件为:
阅读全文
1 0
- 数据结构第三次实验
- 数据结构第三次实验
- 第三次实验
- 第三次实验
- 第三次实验
- 第三次实验
- 第三次实验
- 第三次实验
- 第三次实验
- 第三次实验
- 第三次实验
- 数据结构第三次实验——线性表专题在线评测
- 数据结构第三次
- 第三次C++实验
- 第三次上机实验 报告
- 第三次实验任务
- 第三次上机实验
- 第三次上机实验
- IT界的后门事件
- 入门python3爬虫需要掌握的知识与技巧
- 精通脚本黑客3.1-3.8笔记
- 基于Vue的三级联动下拉框
- Android——RecyclerView——ViewHolder全部源码及翻译、注释
- 数据结构第三次实验
- Ashampoo Burning Studio 19(阿香婆光盘刻录软件)官方破解版V19.0.0.24下载
- javascript中new关键字详解
- 初学 Tensorflow(线性回归预测)
- Oracle批量插入
- 十七周四次课(11月30日) 20.31 expect脚本同步文件 20.32 expect脚本指定host和要同步的文件 20.33 构建文件分发系统 20.34 批量远程执行命令
- 复习1次课(11月28日) 1.3 python的文件类型 1.4 python的变量 1.5 python的数值和字符串 1.6 元组 1.7 列表 1.8 字典 1.9 字典练习
- 复习4次课(12月1日) 1.1 函数定义 1.2 函数的参数 1.3 函数的默认参数 1.4 函数的变量 1.5 函数的返回值 1.6 多类型传值和冗余参数 1.7 函数的递归调用
- Android内部存储和外部存储,以及读取Android读取RAM,ROM内部存储和外部存储卡容量