|
#include<stdio.h>
#include<stdlib.h> #include<conio.h> #include<string.h> int visited[10];/*訪問標志數(shù)組*/ typedef struct ArcCell{ int adj;/*頂點關系類型,用1表示相鄰,0表示不相鄰*/ }ArcCell,**AdjMatrix;/*鄰接矩陣*/ typedef struct type{ char data[3];/*頂點值*/ struct type *next;/*頂點的下一個指針*/ }VertexType; typedef struct{ VertexType *vexs;/*頂點向量*/ AdjMatrix arcs;/*鄰接矩陣*/ int vexnum,arcnum;/*圖的頂點數(shù)和邊數(shù)*/ }MGraph; void InitGraph(MGraph *G)/*初始圖*/ { int i,nu,mu; printf("輸入頂點的個數(shù)和(邊)弧的個數(shù),空格隔開:"); scanf("%d%d",&nu,&mu); G->arcs=(ArcCell **)malloc(nu*sizeof(ArcCell *)); for(i=0;i<nu;i++)/*分配鄰接矩陣空間*/ G->arcs[i]=(ArcCell *)malloc(nu*sizeof(ArcCell)); G->vexs=(VertexType *)malloc(nu*sizeof(VertexType));/*分配頂點空間*/ G->vexnum=nu;G->arcnum=mu;/*圖的頂點數(shù)和邊數(shù)*/ } void InsertGraph(MGraph *G,int i,VertexType e) { if(i<0||i>G->vexnum) return; G->vexs[i].next=e.next; strcpy(G->vexs[i].data,e.data); } int Locate(MGraph G,VertexType v1)/*確定v1在圖頂點中的位置*/ { int i; for(i=0;i<G.vexnum;i++) if(strcmp(v1.data,G.vexs[i].data)==0) return i; return -1; } void CreateUND(MGraph *G)/*采用數(shù)組(鄰接矩陣)和鄰接表表示無向圖*/ {int i,j,k,p[10],d; VertexType v1,v2,*q1,*q2,*q; for(i=0;i<10;i++) p[i]=0; for(i=0;i<G->vexnum;++i)/*初始鄰接表*/ { for(j=0;j<G->vexnum;++j) G->arcs[i][j].adj=0;} for(k=0;k<G->arcnum;++k) {printf("\n輸入第 %d 條(邊)弧相對的兩個頂點值,每輸入一個,按回車:\n",k+1); d=0; scanf("%s%s",v1.data,v2.data);/*輸入相鄰的兩個點值*/ i=Locate(*G,v1);j=Locate(*G,v2);/*用i 和j來確定它們的位置*/ G->arcs[i][j].adj=1; G->arcs[j][i].adj=G->arcs[i][j].adj; q1=(VertexType *)malloc(sizeof(VertexType));/*為q1和q2各分配空間*/ q2=(VertexType *)malloc(sizeof(VertexType)); strcpy(q1->data,G->vexs[i].data); strcpy(q2->data,G->vexs[j].data); q1->next=q2->next=NULL; if(p[i]==0) {G->vexs[i].next=q2;p[i]++;} else {q=&(G->vexs[i]); while(d!=p[i]) {d++;q=q->next;} p[i]++; q->next=q2;/*接在最后*/ } d=0;/*因為是無向圖所以j頂點也要接*/ if(p[j]==0) {G->vexs[j].next=q1;p[j]++;}/*同上*/ else {q=&(G->vexs[j]); while(d!=p[j]) {d++;q=q->next;} p[j]++; q->next=q1; } } } void Pint(MGraph G)/*輸出鄰接矩陣*/ {int i,j; for(i=0;i<G.vexnum;i++) { for(j=0;j<G.vexnum;j++) printf("%d ",G.arcs[i][j].adj); printf("\n"); } } void DFS(MGraph G,int v)/*從第v個頂點出發(fā)遞歸遍歷*/ { VertexType *ptr;/*是對圖的鄰接表作遍歷*/ int i; visited[v]=1;printf(" ** %s ",G.vexs[v].data);/*訪問第V個頂點*/ ptr=G.vexs[v].next;/*V頂點的第一個相鄰點*/ while(ptr!=NULL)/*上面的頂點存在*/ {i=Locate(G,*ptr);/*求出它的位置*/ if(!visited[i]) DFS(G,i); ptr=ptr->next; } } void DFSTraverse(MGraph G)/*對圖作深度遍歷,畫鄰接表分析*/ {int i; for(i=0;i<G.vexnum;i++)/*如果圖是連通的則一次就能遍歷,否則對另一個連通的第一個頂點。。同上*/ if(!visited[i]) DFS(G,i); } void main() { MGraph G; VertexType e,*p; int i; InitGraph(&G); for(i=0;i<10;i++) visited[i]=0;/*初始為0,表示沒被訪問過*/ printf("頂點值,每輸入一個,按回車: \n"); for(i=0;i<G.vexnum;++i)/*給圖頂點向量付值*/ {scanf("%s",e.data);e.next=NULL;InsertGraph(&G,i,e);} CreateUND(&G);/*構造圖結構*/ printf("鄰接矩陣為:\n"); Pint(G);/*輸出鄰接矩陣*/ printf("鄰接表為:\n"); for(i=0;i<G.vexnum;i++)/*輸出鄰接表*/ {printf(" *%s* ",G.vexs[i].data);p=G.vexs[i].next; while(p) {printf(" *%s* ",p->data);p=p->next;} printf("\n"); } printf("深度遍歷結果為:\n"); DFSTraverse(G);/*深度遍歷*/ getch(); } |
|
|
來自: 龍駒游子 > 《數(shù)據(jù)結構》