【数据结构】数据结构C语言的实现【图(邻接表法)】
来源:互联网 发布:ubuntu如何卸载samba 编辑:程序博客网 时间:2024/06/05 01:00
图(邻接表法)
/* * 邻接表的创建和图的遍历的代码实现 */#include <stdio.h>#include <stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define MAX_NUM 20typedef int Status;typedef int QElemType;typedef char VexType;/* * 邻接表存储结构 */typedef struct EdgeNode{ int adjvex; // 顶点的位置 struct EdgeNode *next; // 指向下一条边的指针} EdgeNode, *EdgeLink;typedef struct VexNode{ VexType data; // 顶点数据 EdgeNode *firstEdge; // 指向第一条依附该顶点的边的指针} VexNode, AdjList[MAX_NUM];typedef struct{ AdjList adjList; int vexNum, edgeNum; // 顶点数和边数} ALGraph;/* * 队列存储结构(用于图的遍历) */typedef struct QNode{ QElemType data; //结点数据 struct QNode *next; //指向下一个结点} QNode, *QueuePtr;typedef struct{ QueuePtr front; //队头指针 QueuePtr rear; //队尾指针} LinkQueue;Status InitQueue(LinkQueue *Q){ Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode)); if (!Q->front) exit(OVERFLOW); Q->front->next = NULL; return OK;}Status IsEmpty(LinkQueue Q){ if (Q.front->next == NULL) return TRUE; else return FALSE;}Status EnQueue(LinkQueue *Q, QElemType e){ QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if (!p) exit(OVERFLOW); p->data = e; p->next = NULL; Q->rear->next = p; Q->rear = p; return OK;}Status DeQueue(LinkQueue *Q, QElemType *e){ QueuePtr p; if (Q->front == Q->rear) return ERROR; p = Q->front->next; *e = p->data; Q->front->next = p->next; if (Q->rear == p) Q->rear = Q->front; free(p); return OK;}Status CreateGraph(ALGraph *G){ int i, j, k; EdgeLink e; printf("请输入顶点数目和边数:\n"); scanf("%d", &G->vexNum); scanf("%d", &G->edgeNum); getchar(); printf("请输入各顶点的数据:\n"); for (i = 0; i < G->vexNum; i++) { scanf("%c", &G->adjList[i].data); if (G->adjList[i].data == '\n') { i--; continue; } G->adjList[i].firstEdge = NULL; } printf("请依次输入边(Vi,Vj)的顶点序号:\n"); for (k = 0; k < G->edgeNum; k++) { scanf("%d", &i); scanf("%d", &j); e = (EdgeLink)malloc(sizeof(EdgeNode)); e->adjvex = j; e->next = G->adjList[i].firstEdge; G->adjList[i].firstEdge = e; e = (EdgeLink)malloc(sizeof(EdgeNode)); e->adjvex = i; e->next = G->adjList[j].firstEdge; G->adjList[j].firstEdge = e; } return OK;}int visited[MAX_NUM]; //用于记录遍历状态/* * 递归从第i个结点深度优先遍历图 */void DFS(ALGraph G, int i){ EdgeLink p; visited[i] = TRUE; printf("%c ", G.adjList[i].data); p = G.adjList[i].firstEdge; while (p) { if (!visited[p->adjvex]) DFS(G, p->adjvex); p = p->next; }}/* * 深度优先遍历 */Status DFSTraverse(ALGraph G){ int i; for (i = 0; i < MAX_NUM; i++) visited[i] = FALSE; for (i = 0; i < G.vexNum; i++) { if (!visited[i]) DFS(G, i); } return OK;}/* * 广度优先遍历 */Status BFSTraverse(ALGraph G){ int i; EdgeLink p; LinkQueue Q; InitQueue(&Q); for (i = 0; i < MAX_NUM; i++) visited[i] = FALSE; for (i = 0; i < G.vexNum; i++) { if (!visited[i]) { visited[i] = TRUE; printf("%c ", G.adjList[i].data); EnQueue(&Q, i); while (!IsEmpty(Q)) { DeQueue(&Q, &i); p = G.adjList[i].firstEdge; while (p) { if (!visited[p->adjvex]) { visited[p->adjvex] = TRUE; printf("%c ", G.adjList[p->adjvex].data); EnQueue(&Q, p->adjvex); } p = p->next; } } } } return OK;}int main(){ ALGraph G; CreateGraph(&G); printf("深度优先遍历:"); DFSTraverse(G); printf("\n广度优先遍历:"); BFSTraverse(G); printf("\n");}
0 0
- 【数据结构】数据结构C语言的实现【图(邻接表法)】
- 复习(数据结构):图:c语言:邻接表
- 数据结构->图的邻接表存储(C语言)
- 数据结构之---C语言实现图的邻接表存储表示
- 数据结构(C实现)------- 图的邻接表表示
- 数据结构:图的实现--邻接表
- 数据结构:图的实现--邻接表
- 数据结构:图的实现--邻接表
- 数据结构:无向图的邻接多重表存储表示 (c实现)
- 【数据结构】数据结构C语言的实现(线性表)
- 数据结构与C语言实现(九)——图(上):邻接表,DFS与BFS
- 数据结构的C实现_图_邻接表表示
- 数据结构的C实现_图_邻接表示
- 数据结构---图的邻接表
- 数据结构---图(邻接表)
- 【数据结构】图的构建(邻接表法)
- 数据结构——图的链表实现(邻接表表示法)
- 数据结构(C++)<图的邻接表表示>
- android 编译
- [转帖]易飞9.0.9注册机
- 闲谈System.nanoTime()函数
- Spring中的定时任务
- 学好Python的优秀资源推荐
- 【数据结构】数据结构C语言的实现【图(邻接表法)】
- Spring入门
- 【leetcode】63. Unique Paths II【java】
- 将Excel表格中的数据导出到xml文件中
- 互联网公司产品经理们面试的终极攻略
- 【leetcode】64. Minimum Path Sum【java】
- 第十二章—PopupWindow
- JAVA观察者模式
- 向android studio导入android源生app