#include<stdio.h>node
#include<stdlib.h>數組
#define Max 20 //設定圖的最大頂點數指針
typedef char vertexType; //定義頂點的類型code
//typedef int edgeType;//定義邊上的權重類型索引
#define edgeType int隊列
//定義邊的結構體內存
typedef struct EdgeNode_g {element
int adjVex;//存儲鄰接點的頂點下標,指的是數組的下標 edgeType weight;//存儲邊上的權值 struct EdgeNode_g *next; //指向下一個鄰接點
}EdgeNode;get
//定義頂點的結構體it
typedef struct VerTex_g {
vertexType data;//存儲頂點的信息 EdgeNode *firstNode;
}HeadList;
//定義圖的相關結構體
typedef struct Graph_g {
HeadList headList[Max];//定義頭結點數組變量 int number_vertex;//定義頂點的個數 int number_edge;//定義邊的個數
}Graph;
//建立圖
void createGraph(Graph *p) {
int i; int vertex; printf("請輸入頂點數:"); scanf("%d", &vertex); p->number_vertex = vertex; printf("接下來進行輸入頂點的相關信息\n"); char c; for (i = 0; i < p->number_vertex; i++) { printf("請輸入第%d個頂點的信息:", i); getchar(); c=getchar();//過濾掉回車符 p->headList[i].data = c; p->headList[i].firstNode = NULL; } int edge; //edge1表示邊1,edge2表示邊2,w表示邊上的權重 int edge1, edge2, w; printf("接下來進行邊的相關信息填充\n"); printf("請輸入邊的個數:"); scanf("%d", &edge); p->number_edge = edge; EdgeNode *e; //注意我這裏輸入的頂點1,頂點2的值-1,表明頂點的索引 for (i = 0; i < p->number_edge; i++) { printf("輸入頂點1,頂點2,權重w:"); scanf("%d%d%d", &edge1, &edge2, &w); e = (EdgeNode *)malloc(sizeof(EdgeNode)); e->adjVex = edge2 - 1; e->weight = w; e->next = p->headList[edge1-1].firstNode; p->headList[edge1-1].firstNode = e; e = (EdgeNode *)malloc(sizeof(EdgeNode)); e->adjVex = edge1 - 1; e->weight = w; e->next = p->headList[edge2-1].firstNode; p->headList[edge2-1].firstNode = e; }
}
void display(Graph *head) {
EdgeNode *temp; for (int i = 0; i < head->number_vertex; i++) { temp = head->headList[i].firstNode; printf("%c", head->headList[i].data); //注意判斷條件哈 while (temp!= NULL) { printf("->%d",temp->adjVex); temp = temp->next; } printf("\n"); }
} //DFS遍歷(用鄰接表表示圖)
//x表明頂點點所在的下標
bool visited[Max];
//若是圖連通能夠用這個就夠啦
void DFS(Graph *head,int x) {
if (visited[x] != true) { printf("%3c", head->headList[x].data); } visited[x] = true; int i; EdgeNode *e = head->headList[x].firstNode; while (e!=NULL) { i = e->adjVex; if (visited[i] == false) { DFS(head, i); } e = e->next; }
}
//若是圖不連通,就須要再加上下面的
void DFS_extend(Graph *head) {
for (int i = 0; i < head->number_vertex; i++) DFS(head, i);
}
//定義隊列的目的主要爲了在廣度優先遍歷過程當中使用隊列
//定義隊列的相關實現
typedef int elementType;
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; 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;
} bool visited1[Max]; int reter[Max];
//若是圖是連通的,這樣就夠了
void BFS(Graph *head,int x,L_node *queue) {
if (visited1[x] == false) { push_queue(queue, x); visited1[x] = true; } int t; EdgeNode *e; int j; while (queue->front!=NULL) { t = pop_queue(queue); printf("%3c", head->headList[t].data); e = head->headList[t].firstNode; while (e!= NULL) { j = e->adjVex; if (visited1[j] == false) { push_queue(queue, j); visited1[j] = true; } e = e->next; } }
} //若是圖不連通,就用下面的
void BFS_extend(Graph *g) { L_node * queue=init1(); for (int i = 0; i < g->number_vertex; i++) {
BFS(g, i,queue); }
} int main() {
Graph head; createGraph(&head); display(&head); DFS_extend(&head); printf("\n"); BFS_extend(&head); printf("\n"); system("pause"); return 0;
}