無向圖的表示:鄰接矩陣和鄰接表
阿新 • • 發佈:2019-01-24
這裡將一個無向圖用鄰接表和鄰接矩陣表示。
輸入:頂底個數n,圖中的各個邊(用兩個頂點表示)。
輸出:這個無線圖的鄰接矩陣和鄰接表,其中鄰接表中的連結按元素大小升序排列。
先給出一個例子說明。假設有無向圖如下,則其鄰接矩陣和鄰接表如提示框中所示(其實就是下面程式的輸出)。
下面是程式的程式碼:
#include <stdio.h> #include <stdlib.h> //圖的表示,輸入節點個數和邊,構造圖的鄰接矩陣和鄰接表 //鄰接表中的連結串列節點 struct vNode{ int value; struct vNode* next; }; //向鄰接表中插入一個數據,並保證鄰接表的有序性 void insertIntoAdjVertics(struct vNode** adjVertics,int start,int end){ struct vNode* node = (struct vNode*)malloc(sizeof(struct vNode)); struct vNode* head = adjVertics[start]; node->value = end; node->next = NULL; if(head == NULL){ adjVertics[start] = node; return; } if(head->next==NULL&&head->value>end){ node->next = head; adjVertics[start] = node; return; } while(head->next!=NULL && head->next->value<end){ head = head->next; } if(head->next==NULL){ head->next = node; return; } node->next = head->next; head->next = node; } //列印鄰接矩陣 void displayNeighborMatrix(int** neighborMatrix,int n){ int i,j; printf("\n"); for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%d ",neighborMatrix[i][j]); } printf("\n"); } } //列印鄰接表 void displayAdjVertice(struct vNode** adjVertics,int n){ int i; for(i=0;i<n;i++){ struct vNode* head = adjVertics[i]; printf("%d: ",i); while(head!=NULL){ printf("->%d ",head->value); head = head->next; } printf("\n"); } } int main() { int n,i,j; int** neighborMatrix; struct vNode** adjVertics; int start,end; printf("input vertex number: "); scanf("%d",&n); //初始化鄰接矩陣 neighborMatrix = (int**)malloc(sizeof(int*)*n); for(i=0;i<n;i++){ neighborMatrix[i] = (int*)malloc(sizeof(int)*n); for(j=0;j<n;j++){ neighborMatrix[i][j] = 0; } } adjVertics = (struct vNode**)malloc(sizeof(struct vNode*)*n); for(i=0;i<n;i++){ adjVertics[i] = NULL; } //輸入定點,格式為 1 2 printf("input start and end vertex, format 1 2, stop by -1. \n"); while(1){ scanf("%d",&start); if(start==-1){ break; } scanf("%d",&end); neighborMatrix[start][end] = 1; //對稱矩陣 neighborMatrix[end][start] = 1; insertIntoAdjVertics(adjVertics,start,end); insertIntoAdjVertics(adjVertics,end,start); } displayNeighborMatrix(neighborMatrix,n); printf("-------------\n"); displayAdjVertice(adjVertics,n); return EXIT_SUCCESS; }