#include<stdio.h>node
#include<stdlib.h>數組
#define Max 10指針
typedef int elementType;//注意這個,我爲了和隊列的保持一致,因此用了intcode
//定義圖頂點相關的內容blog
typedef struct Graph_g {隊列
//peek[]數組的類型能夠是字符,根據本身的喜歡定義內存
elementType peek[Max]; int number_vertex;//定義頂點個數 int nubmer_edge;//定義邊的個數 int G[Max][Max];//定義臨接矩陣 //定義是否被訪問的數組 bool c[Max];
}Graph,*Graph_matrax;element
//對圖進行初始化it
Graph_matrax init() {io
Graph_matrax graph= (Graph_matrax)malloc(sizeof(Graph)); int vertex; printf("請輸入頂點的個數:"); scanf("%d", &vertex); graph->number_vertex = vertex; graph->nubmer_edge = 0; int i; //對頂點的信息進行賦值 for (i = 0; i < vertex; i++) { printf("請輸入%d個頂點的信息:",i+1); scanf("%d", &graph->peek[i]); } //臨接矩陣的對腳線賦值爲0,其餘的初始化爲最大值,假設全都不連通 for (int i = 0; i < graph->number_vertex; i++) { for (int j = 0; j < graph->number_vertex; j++) { if (i == j) graph->G[i][j] = 0; else graph->G[i][j] = 8888; } } int edge=0; int v1, v2, w; printf("請輸入邊的數目:"); scanf("%d", &edge); for (i = 0; i < edge; i++) { printf("請輸入i,j,w,有關頂點的到頂點的邊的相關信息:"); scanf("%d%d%d", &v1, &v2, &w); graph->G[v1 - 1][v2 - 1] = w; graph->G[v2 - 1][v1 - 1] = w; } return graph;
}
void display(Graph_matrax g) {
printf("輸出臨接矩陣:\n"); for (int i = 0; i < g->number_vertex; i++) { for (int j = 0; j < g->number_vertex; j++) { printf("%8d", g->G[i][j]); } printf("\n"); }
}
//定義隊列的目的主要爲了在廣度優先遍歷過程當中使用隊列
//定義隊列的相關實現
typedef struct q_node {
elementType data; q_node *next;
}Node;
typedef struct Link_Node {
struct q_node *rear; struct q_node *front;
} L_node;
L_node* init1() {
L_node *p = (L_node *)malloc(sizeof(L_node)); if (p == NULL) { printf("內存滿了\n"); return NULL; } p->rear = p->front = NULL; printf("初始化成功\n"); return p;
}
void push_queue(L_node *p, elementType x) {
//新建個節點存儲數據 Node *temp = (Node *)malloc(sizeof(Node)); if (temp == NULL) { printf("內存滿了\n"); return; } temp->data = x; temp->next = NULL; //判斷下隊列是否無元素 if (p->rear == NULL) { p->rear = temp; p->front = temp; } //若是非空,就把元素插入到隊尾指針的後面 p->rear->next = temp; //要把隊尾指針指向新建立的節點 p->rear = temp;
}
elementType pop_queue(L_node * p) {
Node * temp = p->front; elementType value; if (p->front == NULL) { printf("隊列已經空了\n"); return -1; } //判斷下若是隊列只有一個元素 if (p->front == p->rear) { value = p->front->data; p->front = NULL; p->rear = NULL; free(temp); return value; }
value = p->front->data;
p->front = temp->next; free(temp); return value;
}
void DFS(Graph_matrax g, int x) {
g->c[x-1] = true; printf("%2d", g->peek[x - 1]); for (int i = 0; i < g->number_vertex; i++) { if (x - 1 != i) if (g->G[x - 1][i] == 1) if (g->c[i] != true) DFS(g, i+1); }
}
//使用隊列實現廣度優先遍歷
void BFS(Graph_matrax g, L_node *queue, int x) {
//原本想用 g->c[]這個的,但是不行,我在這把值置爲false沒起做用 //故新建了d[Max]
bool d[Max]; for (int i = 0; i < g->nubmer_edge; i++) d[i] = false; //把該訪問過的頂點放置爲true int j; d[x - 1] = true; printf("%2d", g->peek[x - 1]); //把剛訪問的點壓入到棧中 push_queue(queue, g->peek[x - 1]); //判斷隊列是否爲空,若是爲空,則說明廣度優先遍歷完成 while (queue->front!=NULL) { j = pop_queue(queue); for (int i = 0; i < g->number_vertex; i++) { if(i!=j-1) if(g->G[j-1][i]==1) if (d[i]!= true) { d[i] = true; printf("%2d", g->peek[i]); push_queue(queue, g->peek[i]); } } }
} int main() {
Graph *g = init(); printf("%d\n", g->number_vertex); L_node *p = init1(); display(g); DFS(g, 1); printf("\n"); BFS(g, p, 1); printf("\n"); system("pause"); return 0;
}