图的基本操作:创建 删除 遍历
创建:邻接矩阵和邻接表 十字链表 下面代码是邻接矩阵的定义和邻接表的创建
遍历:深度优先遍历(一条路走到黑) 广度优先遍历(树的层次遍历)
具体代码:
#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--; }