圖的基本操作:創建 刪除 遍歷
創建:鄰接矩陣和鄰接表 十字鏈表 下面代碼是鄰接矩陣的定義和鄰接表的創建
遍歷:深度優先遍歷(一條路走到黑) 廣度優先遍歷(樹的層次遍歷)
具體代碼:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<conio.h> int visited[20] = {0};//標記深度優先遍歷訪問過的節點 訪問過1 未訪問0 //鄰階矩陣存儲 struct pic { int picture[20][20];//假設此圖最大頂點數為20 char data[20];//存放數據的頂點 int e, top;//邊的數量 頂點的數量 }; //鄰階表存儲 struct anode { int array;//數組元素的下標(對應邊的元素) struct anode* next; }; struct node { char dat;//數據元素區域 struct anode* link; }; struct arc { struct node data[100]; int e, top; }; struct arc t; void create_pir();//無向圖 void deep_b();//深度優先遍歷(主函數) void deep_b1(int i);//遞歸函數 int find_fristnode(int i);//尋找第一個領節點 int next_node(int i, int w);//相對於i的下一個元素 void BFS(int i);//廣度優先遍歷 //廣度遍歷需用隊操作 定義一個隊列 struct queue { int a[20];//對中的元素 int top, base; }; void chu_queue(); void enter_queue(int i); void del_queue(int i); struct queue q; int main() { create_pir(); BFS(0); return 0; } void create_pir() { printf("請輸入頂點的數量和邊的數量:\n"); scanf("%d %d", &t.top, &t.e); int i,s,d; printf("請輸入頂點的數據:\n"); for (i = 0; i < t.top; i++) { t.data[i].link = NULL; std::cin>>t.data[i].dat; } for (i = 0; i < t.e; i++) { printf("請輸入對應的兩邊頂點的下標:\n"); scanf("%d %d", &s, &d); //如果為有向圖 輸入以s為狐尾的節點 開辟一次空間就可 struct anode* p; p = (struct anode*)malloc(sizeof(struct anode)); p->array = d; p->next = t.data[s].link; t.data[s].link = p; p = (struct anode*)malloc(sizeof(struct anode)); p->array = s; p->next = t.data[d].link; t.data[d].link = p; } } void deep_b() { int i; for (i = 0; i < t.top; i++) { if (visited[i] == 0) { //沒有等於0 深度優先遍歷 deep_b1(i); } } } void deep_b1(int i) { int a;//遍歷的結束條件 int w;//記錄第一個鄰接結點元素的下標 //假設鄰接表存儲 printf("%c ", t.data[i].dat); visited[i] = 1; //如果是矩陣或者十字鏈表則執行相應操作 //下面內容可根據圖的存儲構造函數 if (t.data[i].link != NULL) { w = t.data[i].link->array; } else { w = -1; } if (visited[w] == 0) { deep_b1(w); } else { return; } //條件不成立就尋找下一個領接點 } void BFS(int i) { int w; printf("%c ", t.data[i].dat); visited[i] = 1; chu_queue(); enter_queue(i); while (q.top!=q.base) { del_queue(i); w = find_fristnode(i); while (w != -1) { if (visited[w] == 0) { printf("%c ", t.data[w].dat); enter_queue(w); } w = next_node(i,w); } } } void chu_queue() { q.top = 0; q.base = 0; } int find_fristnode(int i) { if (t.data[i].link != NULL) { return t.data[i].link->array; } else { return -1; } } int next_node(int i, int w) { struct anode *p; p = t.data[i].link; while (p) { if (p->array != w&& p->array!=i) { return p->array; } p = p->next; } return -1; } void enter_queue(int i) { q.a[q.top] = i; q.top++; } void del_queue(int i) { q.top--; }