【總結】鄰接表 圖的基本操作

來源:互聯網
上載者:User

圖的鏈表格儲存體,廣度優先遍曆,深度優先遍曆

深度優先遍曆用到的是遞迴的概念,也就是棧的使用,這個用的是遞迴函式,棧的使用稍後研究

廣度優先遍曆用到的是隊列的概念,這裡用的是迴圈隊列。要定義隊列的資料結構和一些操作,然後再用。

對於演算法的時間複雜度還是不是很明白。

用到的資料結構:

#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;  }}}

結果

 

直觀圖

 

下一步研究一下棧和圖的其他演算法,最小產生樹和最短路徑

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.