圖的鏈表格儲存體,廣度優先遍曆,深度優先遍曆
深度優先遍曆用到的是遞迴的概念,也就是棧的使用,這個用的是遞迴函式,棧的使用稍後研究
廣度優先遍曆用到的是隊列的概念,這裡用的是迴圈隊列。要定義隊列的資料結構和一些操作,然後再用。
對於演算法的時間複雜度還是不是很明白。
用到的資料結構:
#define MaxVertexNum 100typedef int VertexType;typedef struct node //邊表節點{ int adjvex; node* next;}EdgeNode;typedef struct //頂點表節點{ VertexType vertex; EdgeNode* firstedge;}VertexNode;typedef VertexNode AdjList[MaxVertexNum];typedef struct { AdjList adjlist;int n,e;}ALGraph;//定義迴圈隊列typedef struct {int front;int rare;int count;int data[MaxVertexNum];}CirQueue;//typedef enum{false,true} boolean;bool visited[MaxVertexNum];
用到的函數
void create(ALGraph*);void DFSTraverse(ALGraph*);void DFS(ALGraph*, int);void BFSTraverse(ALGraph*);void BFS(ALGraph*, int);void InitQueue(CirQueue*);int QueueEmpty(CirQueue*);void InQueue(CirQueue* ,int);int DeQueue(CirQueue*);
freopen("D:\\C&C++\\projects\\自己編\\ALgrap\\ALgrap\\input.txt","r",stdin);//從txt檔案讀入
代碼
void main(){ freopen("D:\\C&C++\\projects\\自己編\\ALgrap\\ALgrap\\input.txt","r",stdin);//從txt檔案讀入//freopen("D:\\C&C++\\projects\\自己編\\ALgrap\\ALgrap\\output.txt","w",stdout); ALGraph* G= (ALGraph*)malloc(sizeof(ALGraph)); create(G);printf("鄰接矩陣表:\n"); for (int i=0;i< G->n;i++) { printf("%d->",i); EdgeNode*p; p= G->adjlist[i].firstedge; while(p!=NULL) {printf("%d->",p->adjvex);p=p->next; } printf("\n"); } DFSTraverse(G); BFSTraverse(G); }void create(ALGraph* G){ int i,j,k; EdgeNode *s;//printf("讀入頂點數和邊數"); scanf("%d,%d",&G->n,&G->e); for (i=0;i<G->n;i++) { //fflush(stdin); // printf("建立頂點表"); // G->adjlist[i].vertex=getchar(); scanf("%d",&G->adjlist[i].vertex); G->adjlist[i].firstedge=NULL; } // printf("建立邊表\n"); for (k=0;k<G->e;k++) { // printf("讀入(vi-vj)的頂點對序號"); scanf("%d,%d",&i,&j); s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=j; s->next=G->adjlist[i].firstedge; //插入表頭 G->adjlist[i].firstedge=s; s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=i; s->next=G->adjlist[j].firstedge; G->adjlist[j].firstedge=s; }}void DFSTraverse(ALGraph* G){int i;for (i=0;i<G->n;i++) visited[i]=false;for (i=0;i<G->n;i++) //確保每一個頂點都遍曆過,如果有孤立的也可以if (!visited[i])DFS(G,i);}void DFS(ALGraph* G, int i){ EdgeNode* p; printf("深度遍曆訪問頂點:%d\n",G->adjlist[i].vertex); // fflush(stdout); visited[i]=true; p=G->adjlist[i].firstedge; while (p) { if (!visited[p->adjvex]) DFS(G,p->adjvex); p=p->next; }}//置迴圈隊列為空白void InitQueue(CirQueue* Q){Q->front=Q->rare=0;Q->count=0;}//判斷是否為空白int QueueEmpty(CirQueue* Q){ return Q->count==0;}//入隊void InQueue(CirQueue* Q,int x){ Q->count++; Q->data[Q->rare]=x; Q->rare=(Q->rare+1)%MaxVertexNum;}//出隊int DeQueue(CirQueue* Q){ int temp; temp=Q->data[Q->front]; Q->count--; Q->front=(Q->front+1)%MaxVertexNum; return temp;}void BFSTraverse(ALGraph* G){int i;for (i=0;i<G->n;i++)visited[i]=false;for (i=0;i<G->n;i++) //確保每一個頂點都遍曆過,如果有孤立的也可以if (!visited[i])BFS(G,i);}void BFS(ALGraph* G, int k){CirQueue* Q=(CirQueue*)malloc(sizeof(CirQueue));int i;EdgeNode* p;InitQueue(Q);printf("廣度優先遍曆節點%d\n",G->adjlist[k].vertex);visited[k]=true;InQueue(Q,k);while(!QueueEmpty(Q)){ i=DeQueue(Q); p=G->adjlist[i].firstedge; while(p) { if (!visited[p->adjvex]) { printf("廣度優先遍曆節點%d\n",p->adjvex); //printf("廣度優先遍曆節點%d\n",G->adjlist[p->adjvex].vertex); visited[p->adjvex]=true; InQueue(Q,p->adjvex); } p=p->next; }}}
結果
直觀圖
下一步研究一下棧和圖的其他演算法,最小產生樹和最短路徑