数据结构与C语言实现(九)——图(上):邻接表,DFS与BFS

来源:互联网 发布:数据冗余的坏道 编辑:程序博客网 时间:2024/05/16 06:45
//邻接表#include <stdio.h>#include <stdlib.h>#defineMAXSIZE 100typedef struct LNode_Vertex* Vertex;typedef struct LNode_Edge* Edge;typedef struct LNode_List* List;typedef struct LNode_Queue* Queue;struct LNode_Vertex{int vex;Edge ptr_edge;};struct LNode_Edge{int adjvex;int weight;Edge next;};//因为邻接表的数据结构是,每个顶点表中的节点都引导出一串边节点struct LNode_Queue{List front;List rear;};struct LNode_List{int data;List next;};LNode_Vertex ver[MAXSIZE];int num_vertex, num_edge;int visited[MAXSIZE];void Create_Graph(){printf("你要输入的点和边数\n");scanf("%d %d", &num_vertex, &num_edge);printf("下面请输入顶点\n");for (int i = 0; i < num_vertex; i++){scanf("%d", &ver[i].vex);}printf("下面请输入顶点1,顶点2,权值\n");for (int i = 0; i < num_edge; i++){int vex1, vex2, w;scanf("%d %d %d", &vex1, &vex2, &w);Edge E = (Edge)malloc(sizeof(struct LNode_Edge));//建立一个边节点if(ver[vex1-1].ptr_edge == NULL)ver[vex1-1].ptr_edge = E;else{Edge p = ver[vex1-1].ptr_edge;while (p->next != NULL)//直到找到顶点节点所引导的一系列节点的最后{p = p->next;//每次往后移动一位}p->next = E;//将最后一个的next指向E}E->weight = w;E->adjvex = vex2;E->next = NULL;}}void Print_Graph(){for (int i = 0; i < num_vertex; i++){printf("%d——》", ver[i].vex);if (ver[i].ptr_edge != NULL){printf("[%d,%d]->", ver[i].ptr_edge->adjvex, ver[i].ptr_edge->weight);while (ver[i].ptr_edge->next != NULL){printf("[%d,%d]->", ver[i].ptr_edge->next->adjvex, ver[i].ptr_edge->next->weight);ver[i].ptr_edge->next = ver[i].ptr_edge->next->next;}}putchar('\n');}}void DFS(int i)//从第几个顶点开始,1234标号{visited[i] = 1;//被访问过的置1printf("%d", ver[i-1].vex);//说明走到过了哪个标号for (int j = 1; j <= num_vertex; j++)//在所有的顶点里寻找if (!visited[j])//如果上一级的下面还有没有被访问的DFS(j);//那就访问之}//为了完成BFS,首先我们需要完成一些关于队列的函数,包括入队和出队Queue CreateQueue(){Queue Q = (Queue)malloc(sizeof(struct LNode_Queue));Q->front = Q->rear = NULL;return Q;}int Is_Empty(Queue Q){if ((Q->front == NULL) && (Q->rear == NULL))return 1;elsereturn 0;}void AddQ(Queue Q,int Item){List L = (List)malloc(sizeof(struct LNode_List));if ((Q->rear == NULL)){Q->front = L;Q->rear = L;L->data = Item;L->next = NULL;}else{Q->rear->next = L;Q->rear = L;L->data = Item;L->next = NULL;}}int ExitQ(Queue Q){List q;if (Q->front == NULL){printf("Error:队列中没有元素可以出队");return -1;}q = Q->front;if (Q->front == Q->rear){Q->front = NULL;Q->rear = NULL;}elseQ->front = Q->front->next;int ans = q->data;free(q);return ans;}void BFS(int i){for (int j = 0; j < MAXSIZE; j++)visited[j] = 0;Queue Q = CreateQueue();visited[i] = 1;AddQ(Q, i);printf("%d", ver[i - 1].vex);while (!Is_Empty(Q)){int j = ExitQ(Q);//j的所有邻边全部入队Edge E = ver[j - 1].ptr_edge;//暂时不去考虑没有邻边的情况do{int k = E->adjvex;if (!visited[k]){visited[k] = 1;printf("%d", ver[k - 1].vex);AddQ(Q, k);}E = E->next;} while (E != NULL);}}int main(){Create_Graph();Print_Graph();putchar('\n');DFS(2);putchar('\n');BFS(2);return 0;}/*4 6 1 2 3 41 4 94 3 8 1 2 52 4 61 3 73 1 2*/

阅读全文
0 0
原创粉丝点击