數據結構圖的兩種存儲結構(鄰接矩陣和鄰接表)


數據結構中圖有多種存儲結構,這里我就來說其中較簡單的兩種,鄰接矩陣以及鄰接表。

鄰接矩陣:用一個n*n的矩陣來表示一張圖,矩陣的橫縱坐標均表示圖的點,例如矩陣第i行第j列數字為1,在無向圖中表示點i與點j之間有一條連線,而在有向圖中表示在圖中有一條由i指向j的邊。這個點數字為幾,代表有幾條邊。

鄰接表:用鏈表的形式來表示圖,這個表頭結點所對應的頂點存在相鄰頂點,則把相鄰頂點依次存放於表頭結點所指向的單向鏈表中。

下面分別給出了有向圖的鄰接矩陣以及無向圖的鄰接表實現方法。

 

鄰接矩陣:

 

  1 //數據結構鏈接矩陣
  2 #include<iostream>
  3 #define MAXN 100
  4 using namespace std;
  5 typedef struct{
  6     char vexs[MAXN];
  7     int map[MAXN][MAXN],visit[MAXN],degree[MAXN];
  8     int vexnum,arcnum;
  9 }AMGraph;
 10 
 11 int LocateVex(AMGraph &G,char e)
 12 {
 13     for(int i=0; i<G.vexnum; ++i)
 14     {
 15         if(G.vexs[i] == e)
 16         {
 17             return i;
 18         }
 19     }
 20 }
 21 
 22 void InitMap(AMGraph &G)//建立鄰接矩陣
 23 {
 24     cout<<"請輸入點數和邊數:";
 25     cin>>G.vexnum>>G.arcnum;
 26     cout<<"請輸入各點的名稱:"; 
 27     for(int i=0; i<G.vexnum; ++i)
 28     {
 29         cin>>G.vexs[i];
 30         G.visit[i] = 0; //初始化標記為0 
 31         G.degree[i] = 0; //初始化度為 0 
 32     }
 33     
 34     for(int i=0; i<G.vexnum; ++i)
 35         for(int j=0; j<G.vexnum; ++j)
 36             G.map[i][j] = 0;
 37 
 38     char v1,v2;
 39     cout<<"請輸入每一條邊:"<<endl;
 40     for(int i=0; i<G.arcnum; ++i)
 41     {
 42         cin>>v1>>v2;
 43         int x,y;
 44         x = LocateVex(G,v1);//找到 v1的位置
 45         y = LocateVex(G,v2);//找到 v2的位置
 46         G.degree[x]++; //v1的度++
 47         G.degree[y]++; //v2的度++
 48         G.map[x][y] = 1;
 49     }
 50 }
 51 
 52 void DFS(AMGraph &G,int e)
 53 {
 54     cout<<G.vexs[e]<<' ';
 55     for(int i=0; i<G.vexnum; ++i)
 56     {
 57         if(!G.visit[i] && G.map[e][i])
 58         {
 59             G.visit[i] = 1;
 60             DFS(G,i);
 61         }
 62     }
 63 }
 64 
 65 void BFS(AMGraph &G,int e)
 66 {
 67     for(int i=0; i<G.vexnum; ++i)//初始化標記為0 
 68         G.visit[i] = 0;
 69     G.visit[e] = 1;//起點標記走過 
 70     
 71     int que[MAXN];
 72     int rear=0,front=0,t;
 73     que[rear++] = e;
 74 
 75     while(rear != front)
 76     {
 77         t = que[front++];
 78         front %= MAXN;
 79         cout<<G.vexs[t]<<' ';
 80         for(int i=0; i<G.vexnum; ++i)
 81         {
 82             if(!G.visit[i] && G.map[t][i])
 83             {
 84                 que[rear++] = i;
 85                 rear %= MAXN;
 86                 G.visit[i] = 1;
 87             }
 88         }
 89     }
 90 }
 91 
 92 int main()
 93 {
 94     AMGraph G;
 95     InitMap(G);
 96     cout<<"鄰接矩陣為:"<<endl;
 97     for(int i=0; i<G.vexnum; ++i)
 98     {
 99         for(int j=0; j<G.vexnum; ++j)
100         {
101             cout<<G.map[i][j]<<' ';
102         }
103         cout<<endl;
104     }
105     char a;
106     bool flag = false;
107     cout<<"請輸入搜索的起點:"<<endl;
108     cin>>a;
109     for(int i=0; i<G.vexnum; ++i)
110     {
111         if(G.vexs[i] == a)
112         {
113             flag = true;
114             G.visit[i] = 1;
115             cout<<"深度優先遍歷結果:";
116             DFS(G,i);//深搜
117             cout<<endl;
118             
119             cout<<"廣度優先遍歷結果:";
120             BFS(G,i);//廣搜
121             cout<<endl;
122             cout<<"每個點的度分別為:";
123             for(int j=0; j<G.vexnum; ++j)
124                 cout<<G.degree[j]<<' ';
125             break;
126         }
127     }
128     if(!flag)
129         cout<<"無名字為"<<a<<"的點"<<endl;
130     return 0;
131 }
132  
133 /*
134 0 1
135 0 2
136 0 3
137 1 4
138 2 4
139 2 5
140 3 5
141 4 6
142 5 6
143 */

 

 

 

鄰接表:

  1 #include<iostream>
  2 #define MAXN 100
  3 using namespace std;
  4 typedef struct ArcNode{
  5     char adjvex;
  6     struct ArcNode *next;
  7 }ArcNode;
  8 typedef struct VNode{
  9     char data;
 10     ArcNode *frist;
 11 }VNode,AdjList[MAXN];
 12 typedef struct{
 13     AdjList vertices;
 14     int vexnum,arcnum;
 15     int visit[MAXN],degree[MAXN];
 16 }ALGraph;
 17 
 18 int LocateVex(ALGraph &G,char e)
 19 {
 20     for(int i=0; i<G.vexnum; ++i)
 21         if(G.vertices[i].data == e)
 22             return i;
 23 }
 24 
 25 void InitMap(ALGraph &G)
 26 {
 27     cout<<"請輸入點數和邊數:";
 28     cin>>G.vexnum>>G.arcnum;
 29     cout<<"請輸入各點的名稱:";
 30     for(int i=0; i<G.vexnum; ++i)
 31     {
 32         cin>>G.vertices[i].data;
 33         G.visit[i] = 0;
 34         G.degree[i] = 0;
 35         G.vertices[i].frist = NULL;
 36     }
 37     
 38     char v1,v2;
 39     cout<<"請輸入每一條邊:"<<endl;
 40     for(int i=0; i<G.arcnum; ++i)
 41     {
 42         cin>>v1>>v2;
 43         int x,y;
 44         x = LocateVex(G,v1);
 45         y = LocateVex(G,v2);
 46         
 47         G.degree[x]++;
 48         G.degree[y]++;
 49         
 50         ArcNode *p1 = new ArcNode;
 51         p1->adjvex = y;
 52         p1->next = G.vertices[x].frist;
 53         G.vertices[x].frist = p1;
 54         
 55         ArcNode *p2 = new ArcNode;
 56         p2->adjvex = x;
 57         p2->next = G.vertices[y].frist;
 58         G.vertices[y].frist = p2;
 59     }
 60 }
 61 
 62 void DFS(ALGraph &G,int e)
 63 {
 64     cout<<G.vertices[e].data<<' ';
 65     G.visit[e] = 1;
 66     ArcNode *p = new ArcNode;
 67     p = G.vertices[e].frist;
 68     while(p != NULL)
 69     {
 70         if(!G.visit[p->adjvex])
 71             DFS(G,p->adjvex);
 72         p = p->next;
 73     }
 74     delete p;
 75 }
 76 
 77 void BFS(ALGraph &G,int e)
 78 {
 79     for(int i=0; i<G.vexnum; ++i)
 80         G.visit[i] = 0;
 81     G.visit[e] = 1;
 82     
 83     int rear = 0, front = 0,t;
 84     int que[MAXN];
 85     que[rear++] = e;
 86     while(rear != front)
 87     {
 88         t = que[front++];
 89         front %= MAXN;
 90         cout<<G.vertices[t].data<<' ';
 91         ArcNode *p = new ArcNode;
 92         p = G.vertices[t].frist;
 93         while(p != NULL)
 94         {
 95             if(!G.visit[p->adjvex])
 96             {
 97                 G.visit[p->adjvex] = 1;
 98                 que[rear++] = p->adjvex;
 99                 rear %= MAXN;
100             }
101             p = p->next;
102         }
103     }
104 }
105 
106 int main()
107 {
108     ALGraph G;
109     InitMap(G);
110     char a;
111     cout<<"請輸入搜索的起點:";
112     cin>>a;
113     for(int i=0; i<G.vexnum; ++i)
114     {
115         if(G.vertices[i].data == a)
116         {
117             cout<<"深度優先遍歷結果:";
118             DFS(G,i);
119             cout<<endl;
120             
121             cout<<"廣度優先遍歷結果:";
122             BFS(G,i);
123             cout<<endl;
124             break;
125         }
126     }
127     cout<<"每個點的度分別為:";
128     for(int i=0; i<G.vexnum; ++i)
129         cout<<G.degree[i]<<' ';
130     cout<<endl;
131     return 0;
132 }
133 
134 /*
135 5 6
136 01234
137 0 1
138 0 3
139 1 2
140 1 4
141 2 3
142 2 4
143 */

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM