当前位置:   article > 正文

头歌数据结构——图——课上课后练_头歌数据结构图课上课后练习

头歌数据结构图课上课后练习

第1关:图的邻接矩阵存储及图初始化

本关任务:根据下面的描述和要求,完成图的邻接矩阵数据结构定义,及图初始化函数。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 6
  4. #define MAX 100
  5. typedef struct {
  6. int vex;
  7. int shortweight;
  8. }ShortWeight;
  9. typedef struct QueueNode{
  10. int val;
  11. struct QueueNode* next;
  12. }QueueNode;
  13. typedef struct Queue{
  14. QueueNode *head;
  15. QueueNode *tail;
  16. }Queue;
  17. //邻接矩阵数据结构
  18. typedef struct{
  19. int vcount;//顶点数
  20. int type ;//0 无向图,1 有向图
  21. char vexs[N] ; // 顶点信息
  22. int arcs[N][N]; //关系矩阵
  23. } GraphMatrix;
  24. //邻接表数据结构
  25. struct EdgeNode { //边表中的结点
  26. int endvex; //相邻顶点在顶点表中下标
  27. int weight; //边的权
  28. struct EdgeNode * nextedge; //链字段
  29. };
  30. typedef struct EdgeNode * EdgeList;
  31. typedef struct
  32. {
  33. char vertex; //记录顶点信息
  34. int degree;//用于记录顶点的入度,在拓扑排序时需使用
  35. EdgeList edgelist; //指向边表的指针
  36. } VexNode;
  37. typedef struct{
  38. VexNode *vexs[N]; //N个顶点
  39. int type ;//0 无向图,1 有向图
  40. int vcount;//顶点数
  41. } GraphList;
  42. /*第一关 完成图初始化
  43. */
  44. void printGraph(GraphMatrix *G)
  45. {//本函数输出图的邻接矩阵
  46. int i,j;
  47. for(i=0;i<G->vcount;i++)
  48. {
  49. // printf("%c ",G->vexs[i]);
  50. for( j=0;j<G->vcount;j++)
  51. printf("%d ",G->arcs[i][j]);
  52. printf("\n");
  53. }
  54. }
  55. /*第一关 完成图初始化-邻接矩阵
  56. */
  57. GraphMatrix *initGraphMatrix( )
  58. {
  59. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  60. 输出邻接矩阵,不需要考虑输入的数字非法情况,不输入顶点的信息*/
  61. GraphMatrix *G;
  62. G=(GraphMatrix *)malloc(sizeof(GraphMatrix));
  63. int t,v,s;
  64. scanf("%d %d %d",&t,&v,&s);
  65. G->vcount=v;
  66. G->type=t;
  67. int i,j;
  68. for(i=0;i<N;i++){
  69. for(j=0;j<N;j++){
  70. G->arcs[i][j]=0;
  71. }
  72. }
  73. int head,tail;
  74. if(t==0)
  75. for(i=0;i<N;i++){
  76. scanf("%d %d",&head,&tail);
  77. G->arcs[head][tail]=1;
  78. G->arcs[tail][head]=1;
  79. }
  80. if(t==1){
  81. for(i=0;i<N;i++){
  82. scanf("%d %d",&head,&tail);
  83. G->arcs[head][tail]=1;
  84. }
  85. }
  86. return G;
  87. }
  88. /*第二关 完成图初始化-邻接表,并完成输出图的邻接表函数
  89. */
  90. GraphList* initGraphList()
  91. {
  92. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  93. 输出邻接表。不需考虑输入的数字非法情况,输入顶点的信息*/
  94. GraphList* G = (GraphList*)malloc(sizeof(GraphList));
  95. int t, v, s;
  96. scanf("%d%d%d", &t, &v, &s);
  97. G->vcount = v;
  98. G->type = t;
  99. int i, j, k, l;
  100. char vex[N];
  101. char ch = getchar();
  102. for (i = 0; i < v; i++) {
  103. scanf("%c", &vex[i]);
  104. }
  105. for (i = 0; i < v; i++) {
  106. G->vexs[i] = (VexNode*)malloc(sizeof(VexNode));
  107. G->vexs[i]->vertex = vex[i];
  108. G->vexs[i]->edgelist = (EdgeList)malloc(sizeof(struct EdgeNode));
  109. G->vexs[i]->edgelist->nextedge = NULL;
  110. }
  111. for (i = 0; i < s; i++) {
  112. int head, tail,w;
  113. scanf("%d %d %d", &head, &tail,&w);
  114. if (t == 0) {
  115. for (k = 0; k < v; k++) {
  116. if (G->vexs[k]->vertex - '0' == head) {
  117. EdgeList node1 = (EdgeList)malloc(sizeof(struct EdgeNode));
  118. for (j = 0; j < v; j++) {
  119. if (vex[j] - '0' == tail) {
  120. node1->weight = w;
  121. node1->endvex = j;
  122. node1->nextedge = G->vexs[k]->edgelist->nextedge;
  123. G->vexs[k]->edgelist->nextedge = node1;
  124. break;
  125. }
  126. }
  127. for (j = 0; j < v; j++) {
  128. if (G->vexs[j]->vertex - '0' == tail) {
  129. EdgeList node2 = (EdgeList)malloc(sizeof(struct EdgeNode));
  130. for (l = 0; l < v; l++) {
  131. if (vex[l] - '0' == head) {
  132. node2->weight = w;
  133. node2->endvex = l;
  134. node2->nextedge = G->vexs[j]->edgelist->nextedge;
  135. G->vexs[j]->edgelist->nextedge = node2;
  136. break;
  137. }
  138. }
  139. }
  140. }
  141. }
  142. }
  143. }
  144. }
  145. return G;
  146. }
  147. void printGraphLit( GraphList *G)
  148. {
  149. /*输出邻接表,输出格式:顶点->邻接顶点编号->...*/
  150. int i;
  151. for(i=0;i<G->vcount;i++){
  152. printf("%c->",G->vexs[i]->vertex);
  153. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  154. while(tp->nextedge!=NULL){
  155. printf("%d->",tp->endvex);
  156. tp=tp->nextedge;
  157. }
  158. printf("%d\n",tp->endvex);
  159. }
  160. }
  161. /*第三关 完成图的广度遍历(周游),可根据需要添加自定义函数
  162. */
  163. int visited[N]={0};
  164. void BFS_list(GraphList *G)
  165. {
  166. int i,j;
  167. printf("%c ",G->vexs[0]->vertex);
  168. visited[0]=1;
  169. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  170. while(tp->nextedge!=NULL){
  171. printf("%d ",tp->endvex);
  172. visited[tp->endvex]=1;
  173. tp=tp->nextedge;
  174. }
  175. printf("%d ",tp->endvex);
  176. visited[tp->endvex]=1;
  177. for(i=N-1;i>=0;i--){
  178. if(visited[i]==1){
  179. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  180. while(tp->nextedge!=NULL && visited[tp->endvex]==0){
  181. printf("%d ",tp->endvex);
  182. visited[tp->endvex]=1;
  183. tp=tp->nextedge;
  184. }
  185. }
  186. }
  187. }
  188. /*第四关 完成图的深度遍历(周游),可根据需要添加自定义函数
  189. */
  190. int visited2[N];
  191. void DFS_list(GraphList *G)
  192. {
  193. int i,j,k;
  194. for(i=0;i<N;i++){
  195. visited2[i]=0;
  196. }
  197. printf("%c ",G->vexs[0]->vertex);
  198. visited2[0]=1;
  199. EdgeList tp=G->vexs[0]->edgelist->nextedge;
  200. printf("%d ",tp->endvex);
  201. visited2[tp->endvex]=1;
  202. int num=4;
  203. while(1){
  204. for(i=0;i<G->vcount;i++){
  205. if(G->vexs[i]->vertex-'0'==tp->endvex){
  206. EdgeList tp2=G->vexs[i]->edgelist->nextedge;
  207. if(visited2[tp2->endvex]==0){
  208. tp=tp2;
  209. printf("%d ",tp2->endvex);
  210. visited2[tp2->endvex]=1;
  211. break;
  212. }
  213. else if(visited2[tp2->endvex]==1){
  214. for(tp2=tp2->nextedge;tp2!=NULL;tp2=tp2->nextedge){
  215. if(visited2[tp2->endvex]==0){
  216. tp=tp2;
  217. printf("%d ",tp2->endvex);
  218. visited2[tp2->endvex]=1;
  219. break;
  220. }
  221. }
  222. }
  223. }
  224. }
  225. int count=0;
  226. for(i=0;i<N;i++){
  227. if(visited2[i]==1) count++;
  228. }
  229. if(count==G->vcount) break;
  230. }
  231. }
  232. /*第五关 生成图的拓扑排序,可根据需要添加自定义函数
  233. */
  234. void QueueInit(Queue* pq) {
  235. pq->head = pq->tail = NULL;
  236. }
  237. void QueuePush(Queue* pq, int x) {
  238. QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
  239. newnode->val = x;
  240. newnode->next = NULL;
  241. if (pq->tail == NULL) {
  242. pq->head = pq->tail = newnode;
  243. }
  244. else {
  245. pq->tail->next = newnode;
  246. pq->tail = newnode;
  247. }
  248. }
  249. void QueuePop(Queue* pq) {
  250. if (pq->head->next == NULL) {
  251. pq->head = pq->tail = NULL;
  252. }
  253. else {
  254. QueueNode* next = pq->head->next;
  255. pq->head = next;
  256. }
  257. }
  258. int QueueFront(Queue* pq) {
  259. return pq->head->val;
  260. }
  261. int QueueEmpty(Queue* pq) {
  262. return pq->head == NULL;
  263. }
  264. void Top_list(GraphList* G)
  265. {
  266. Queue* Q=(Queue *)malloc(sizeof(Queue));
  267. QueueInit(Q);
  268. int i;
  269. int deg[N];
  270. for (i = 0; i < N; i++) {
  271. deg[i] = 0;
  272. }
  273. for (i = 0; i < N; i++) {
  274. deg[i] = G->vexs[i]->degree;
  275. }
  276. for (i = 0; i < N; i++) {
  277. if (deg[i] == 0) {
  278. QueuePush(Q, i);
  279. }
  280. }
  281. while (!QueueEmpty(Q)) {
  282. int j = QueueFront(Q);
  283. printf("%d ", j);
  284. QueuePop(Q);
  285. EdgeList p;
  286. p = G->vexs[j]->edgelist->nextedge;
  287. while (p != NULL) {
  288. deg[p->endvex]--;
  289. if (deg[p->endvex] == 0) {
  290. QueuePush(Q, p->endvex);
  291. }
  292. p = p->nextedge;
  293. }
  294. }
  295. }
  296. /*第六关 prim算法生成最小生成树
  297. */
  298. int GetShortWeight(GraphList* G,ShortWeight *shortw) {
  299. int i;
  300. int min = MAX;
  301. int loc;
  302. for (i = 1; i < G->vcount; i++) {
  303. if (min > shortw[i].shortweight && shortw[i].shortweight != 0) {
  304. min = shortw[i].shortweight;
  305. loc = i;
  306. }
  307. }
  308. return loc;
  309. }
  310. void Prim_list(GraphList* G)
  311. {
  312. int i, j, k;
  313. ShortWeight shortw[10];
  314. for (i = 0; i < 10; i++) {
  315. shortw[i].shortweight = MAX;
  316. }
  317. k = 0;
  318. EdgeList tp = G->vexs[k]->edgelist->nextedge;
  319. while (tp) {
  320. shortw[tp->endvex].shortweight= tp->weight;
  321. shortw[tp->endvex].vex = k;
  322. tp = tp->nextedge;
  323. }
  324. shortw[k].shortweight = 0;
  325. for (i = 0; i < G->vcount - 1; i++) {
  326. k = GetShortWeight(G, shortw);
  327. printf("%d %d\n", shortw[k].vex, k);
  328. shortw[k].shortweight = 0;
  329. EdgeList tp2 = G->vexs[k]->edgelist->nextedge;
  330. while (tp2) {
  331. if (tp2->weight < shortw[tp2->endvex].shortweight) {
  332. shortw[tp2->endvex].shortweight = tp2->weight;
  333. shortw[tp2->endvex].vex = k;
  334. }
  335. tp2 = tp2->nextedge;
  336. }
  337. }
  338. }
  339. /*第七关 Kruskal算法生成最小生成树
  340. */
  341. void Kruskal_list(GraphList *G)
  342. {
  343. }
  344. /*第八关 Dijistra算法求最短路径
  345. */
  346. void Dijkstra_list(GraphList *G)
  347. {
  348. }

第2关:图的邻接表存储及图初始化

本关任务:编写一个能输入图的基本信息(含图的类型,图的顶点,边等),并用邻接表存储图的程序。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 6
  4. #define MAX 100
  5. typedef struct {
  6. int vex;
  7. int shortweight;
  8. }ShortWeight;
  9. typedef struct QueueNode{
  10. int val;
  11. struct QueueNode* next;
  12. }QueueNode;
  13. typedef struct Queue{
  14. QueueNode *head;
  15. QueueNode *tail;
  16. }Queue;
  17. //邻接矩阵数据结构
  18. typedef struct{
  19. int vcount;//顶点数
  20. int type ;//0 无向图,1 有向图
  21. char vexs[N] ; // 顶点信息
  22. int arcs[N][N]; //关系矩阵
  23. } GraphMatrix;
  24. //邻接表数据结构
  25. struct EdgeNode { //边表中的结点
  26. int endvex; //相邻顶点在顶点表中下标
  27. int weight; //边的权
  28. struct EdgeNode * nextedge; //链字段
  29. };
  30. typedef struct EdgeNode * EdgeList;
  31. typedef struct
  32. {
  33. char vertex; //记录顶点信息
  34. int degree;//用于记录顶点的入度,在拓扑排序时需使用
  35. EdgeList edgelist; //指向边表的指针
  36. } VexNode;
  37. typedef struct{
  38. VexNode *vexs[N]; //N个顶点
  39. int type ;//0 无向图,1 有向图
  40. int vcount;//顶点数
  41. } GraphList;
  42. /*第二关 完成图初始化-邻接表,并完成输出图的邻接表函数
  43. */
  44. GraphList *initGraphList()
  45. {
  46. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  47. 输出邻接表。不需考虑输入的数字非法情况,输入顶点的信息*/
  48. GraphList *G=(GraphList*)malloc(sizeof(GraphList));
  49. int t,v,s;
  50. scanf("%d%d%d",&t,&v,&s);
  51. G->vcount=v;
  52. G->type=t;
  53. int i,j,k,l;
  54. char vex[N];
  55. char ch=getchar();
  56. for(i=0;i<v;i++){
  57. scanf("%c",&vex[i]);
  58. }
  59. for(i=0;i<v;i++){
  60. G->vexs[i]=(VexNode *)malloc(sizeof(VexNode));
  61. G->vexs[i]->vertex=vex[i];
  62. G->vexs[i]->edgelist=(EdgeList)malloc(sizeof(struct EdgeNode));
  63. G->vexs[i]->edgelist->nextedge=NULL;
  64. G->vexs[i]->degree=0;
  65. }
  66. for(i=0;i<s;i++){
  67. int head,tail;
  68. scanf("%d %d",&head,&tail);
  69. if(t==0){
  70. for(k=0;k<v;k++){
  71. if(G->vexs[k]->vertex-'0'==head){
  72. EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
  73. for(j=0;j<v;j++){
  74. if(vex[j]-'0'==tail){
  75. node1->endvex=j;
  76. node1->nextedge=G->vexs[k]->edgelist->nextedge;
  77. G->vexs[k]->edgelist->nextedge=node1;
  78. break;
  79. }
  80. }
  81. for(j=0;j<v;j++){
  82. if(G->vexs[j]->vertex-'0'==tail){
  83. EdgeList node2=(EdgeList)malloc(sizeof(struct EdgeNode));
  84. for(l=0;l<v;l++){
  85. if(vex[l]-'0'==head){
  86. node2->endvex=l;
  87. node2->nextedge=G->vexs[j]->edgelist->nextedge;
  88. G->vexs[j]->edgelist->nextedge=node2;
  89. break;
  90. }
  91. }
  92. }
  93. }
  94. }
  95. }
  96. }
  97. else if(t==1){
  98. for(k=0;k<v;k++){
  99. if(G->vexs[k]->vertex-'0'==head){
  100. EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
  101. for(j=0;j<v;j++){
  102. if(vex[j]-'0'==tail){
  103. for(l=0;l<G->vcount;l++){
  104. if(G->vexs[l]->vertex-'0'==tail){
  105. G->vexs[l]->degree++;
  106. }
  107. }
  108. node1->endvex=j;
  109. node1->nextedge=G->vexs[k]->edgelist->nextedge;
  110. G->vexs[k]->edgelist->nextedge=node1;
  111. break;
  112. }
  113. }
  114. }
  115. }
  116. }
  117. }
  118. return G;
  119. }
  120. void printGraphLit( GraphList *G)
  121. {
  122. /*输出邻接表,输出格式:顶点->邻接顶点编号->...*/
  123. int i;
  124. for(i=0;i<G->vcount;i++){
  125. printf("%c->",G->vexs[i]->vertex);
  126. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  127. while(tp->nextedge!=NULL){
  128. printf("%d->",tp->endvex);
  129. tp=tp->nextedge;
  130. }
  131. printf("%d\n",tp->endvex);
  132. }
  133. }

第3关:图的广度遍历

本关任务:完成程序能实现图的广度遍历。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 6
  4. #define MAX 100
  5. typedef struct {
  6. int vex;
  7. int shortweight;
  8. }ShortWeight;
  9. typedef struct QueueNode{
  10. int val;
  11. struct QueueNode* next;
  12. }QueueNode;
  13. typedef struct Queue{
  14. QueueNode *head;
  15. QueueNode *tail;
  16. }Queue;
  17. //邻接矩阵数据结构
  18. typedef struct{
  19. int vcount;//顶点数
  20. int type ;//0 无向图,1 有向图
  21. char vexs[N] ; // 顶点信息
  22. int arcs[N][N]; //关系矩阵
  23. } GraphMatrix;
  24. //邻接表数据结构
  25. struct EdgeNode { //边表中的结点
  26. int endvex; //相邻顶点在顶点表中下标
  27. int weight; //边的权
  28. struct EdgeNode * nextedge; //链字段
  29. };
  30. typedef struct EdgeNode * EdgeList;
  31. typedef struct
  32. {
  33. char vertex; //记录顶点信息
  34. int degree;//用于记录顶点的入度,在拓扑排序时需使用
  35. EdgeList edgelist; //指向边表的指针
  36. } VexNode;
  37. typedef struct{
  38. VexNode *vexs[N]; //N个顶点
  39. int type ;//0 无向图,1 有向图
  40. int vcount;//顶点数
  41. } GraphList;
  42. /*第一关 完成图初始化-邻接矩阵
  43. */
  44. GraphMatrix *initGraphMatrix( )
  45. {
  46. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  47. 输出邻接矩阵,不需要考虑输入的数字非法情况,不输入顶点的信息*/
  48. GraphMatrix *G;
  49. G=(GraphMatrix *)malloc(sizeof(GraphMatrix));
  50. int t,v,s;
  51. scanf("%d %d %d",&t,&v,&s);
  52. G->vcount=v;
  53. G->type=t;
  54. int i,j;
  55. for(i=0;i<N;i++){
  56. for(j=0;j<N;j++){
  57. G->arcs[i][j]=0;
  58. }
  59. }
  60. int head,tail;
  61. if(t==0)
  62. for(i=0;i<N;i++){
  63. scanf("%d %d",&head,&tail);
  64. G->arcs[head][tail]=1;
  65. G->arcs[tail][head]=1;
  66. }
  67. if(t==1){
  68. for(i=0;i<N;i++){
  69. scanf("%d %d",&head,&tail);
  70. G->arcs[head][tail]=1;
  71. }
  72. }
  73. return G;
  74. }
  75. /*第二关 完成图初始化-邻接表,并完成输出图的邻接表函数
  76. */
  77. GraphList *initGraphList()
  78. {
  79. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  80. 输出邻接表。不需考虑输入的数字非法情况,输入顶点的信息*/
  81. GraphList *G=(GraphList*)malloc(sizeof(GraphList));
  82. int t,v,s;
  83. scanf("%d%d%d",&t,&v,&s);
  84. G->vcount=v;
  85. G->type=t;
  86. int i,j,k,l;
  87. char vex[N];
  88. char ch=getchar();
  89. for(i=0;i<v;i++){
  90. scanf("%c",&vex[i]);
  91. }
  92. for(i=0;i<v;i++){
  93. G->vexs[i]=(VexNode *)malloc(sizeof(VexNode));
  94. G->vexs[i]->vertex=vex[i];
  95. G->vexs[i]->edgelist=(EdgeList)malloc(sizeof(struct EdgeNode));
  96. G->vexs[i]->edgelist->nextedge=NULL;
  97. G->vexs[i]->degree=0;
  98. }
  99. for(i=0;i<s;i++){
  100. int head,tail;
  101. scanf("%d %d",&head,&tail);
  102. if(t==0){
  103. for(k=0;k<v;k++){
  104. if(G->vexs[k]->vertex-'0'==head){
  105. EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
  106. for(j=0;j<v;j++){
  107. if(vex[j]-'0'==tail){
  108. node1->endvex=j;
  109. node1->nextedge=G->vexs[k]->edgelist->nextedge;
  110. G->vexs[k]->edgelist->nextedge=node1;
  111. break;
  112. }
  113. }
  114. for(j=0;j<v;j++){
  115. if(G->vexs[j]->vertex-'0'==tail){
  116. EdgeList node2=(EdgeList)malloc(sizeof(struct EdgeNode));
  117. for(l=0;l<v;l++){
  118. if(vex[l]-'0'==head){
  119. node2->endvex=l;
  120. node2->nextedge=G->vexs[j]->edgelist->nextedge;
  121. G->vexs[j]->edgelist->nextedge=node2;
  122. break;
  123. }
  124. }
  125. }
  126. }
  127. }
  128. }
  129. }
  130. else if(t==1){
  131. for(k=0;k<v;k++){
  132. if(G->vexs[k]->vertex-'0'==head){
  133. EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
  134. for(j=0;j<v;j++){
  135. if(vex[j]-'0'==tail){
  136. for(l=0;l<G->vcount;l++){
  137. if(G->vexs[l]->vertex-'0'==tail){
  138. G->vexs[l]->degree++;
  139. }
  140. }
  141. node1->endvex=j;
  142. node1->nextedge=G->vexs[k]->edgelist->nextedge;
  143. G->vexs[k]->edgelist->nextedge=node1;
  144. break;
  145. }
  146. }
  147. }
  148. }
  149. }
  150. }
  151. return G;
  152. }
  153. void printGraphLit( GraphList *G)
  154. {
  155. /*输出邻接表,输出格式:顶点->邻接顶点编号->...*/
  156. int i;
  157. for(i=0;i<G->vcount;i++){
  158. printf("%c->",G->vexs[i]->vertex);
  159. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  160. while(tp->nextedge!=NULL){
  161. printf("%d->",tp->endvex);
  162. tp=tp->nextedge;
  163. }
  164. printf("%d\n",tp->endvex);
  165. }
  166. }
  167. /*第三关 完成图的广度遍历(周游),可根据需要添加自定义函数
  168. */
  169. int visited[N]={0};
  170. void BFS_list(GraphList *G)
  171. {
  172. int i,j;
  173. printf("%c ",G->vexs[0]->vertex);
  174. visited[0]=1;
  175. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  176. while(tp->nextedge!=NULL){
  177. printf("%d ",tp->endvex);
  178. visited[tp->endvex]=1;
  179. tp=tp->nextedge;
  180. }
  181. printf("%d ",tp->endvex);
  182. visited[tp->endvex]=1;
  183. for(i=N-1;i>=0;i--){
  184. if(visited[i]==1){
  185. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  186. while(tp->nextedge!=NULL && visited[tp->endvex]==0){
  187. printf("%d ",tp->endvex);
  188. visited[tp->endvex]=1;
  189. tp=tp->nextedge;
  190. }
  191. }
  192. }
  193. }

第4关:图的深度遍历

本关任务:完成程序能实现图的深度遍历。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 6
  4. #define MAX 100
  5. typedef struct {
  6. int vex;
  7. int shortweight;
  8. }ShortWeight;
  9. typedef struct QueueNode{
  10. int val;
  11. struct QueueNode* next;
  12. }QueueNode;
  13. typedef struct Queue{
  14. QueueNode *head;
  15. QueueNode *tail;
  16. }Queue;
  17. //邻接矩阵数据结构
  18. typedef struct{
  19. int vcount;//顶点数
  20. int type ;//0 无向图,1 有向图
  21. char vexs[N] ; // 顶点信息
  22. int arcs[N][N]; //关系矩阵
  23. } GraphMatrix;
  24. //邻接表数据结构
  25. struct EdgeNode { //边表中的结点
  26. int endvex; //相邻顶点在顶点表中下标
  27. int weight; //边的权
  28. struct EdgeNode * nextedge; //链字段
  29. };
  30. typedef struct EdgeNode * EdgeList;
  31. typedef struct
  32. {
  33. char vertex; //记录顶点信息
  34. int degree;//用于记录顶点的入度,在拓扑排序时需使用
  35. EdgeList edgelist; //指向边表的指针
  36. } VexNode;
  37. typedef struct{
  38. VexNode *vexs[N]; //N个顶点
  39. int type ;//0 无向图,1 有向图
  40. int vcount;//顶点数
  41. } GraphList;
  42. /*第一关 完成图初始化-邻接矩阵
  43. */
  44. GraphMatrix *initGraphMatrix( )
  45. {
  46. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  47. 输出邻接矩阵,不需要考虑输入的数字非法情况,不输入顶点的信息*/
  48. GraphMatrix *G;
  49. G=(GraphMatrix *)malloc(sizeof(GraphMatrix));
  50. int t,v,s;
  51. scanf("%d %d %d",&t,&v,&s);
  52. G->vcount=v;
  53. G->type=t;
  54. int i,j;
  55. for(i=0;i<N;i++){
  56. for(j=0;j<N;j++){
  57. G->arcs[i][j]=0;
  58. }
  59. }
  60. int head,tail;
  61. if(t==0)
  62. for(i=0;i<N;i++){
  63. scanf("%d %d",&head,&tail);
  64. G->arcs[head][tail]=1;
  65. G->arcs[tail][head]=1;
  66. }
  67. if(t==1){
  68. for(i=0;i<N;i++){
  69. scanf("%d %d",&head,&tail);
  70. G->arcs[head][tail]=1;
  71. }
  72. }
  73. return G;
  74. }
  75. /*第二关 完成图初始化-邻接表,并完成输出图的邻接表函数
  76. */
  77. GraphList *initGraphList()
  78. {
  79. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  80. 输出邻接表。不需考虑输入的数字非法情况,输入顶点的信息*/
  81. GraphList *G=(GraphList*)malloc(sizeof(GraphList));
  82. int t,v,s;
  83. scanf("%d%d%d",&t,&v,&s);
  84. G->vcount=v;
  85. G->type=t;
  86. int i,j,k,l;
  87. char vex[N];
  88. char ch=getchar();
  89. for(i=0;i<v;i++){
  90. scanf("%c",&vex[i]);
  91. }
  92. for(i=0;i<v;i++){
  93. G->vexs[i]=(VexNode *)malloc(sizeof(VexNode));
  94. G->vexs[i]->vertex=vex[i];
  95. G->vexs[i]->edgelist=(EdgeList)malloc(sizeof(struct EdgeNode));
  96. G->vexs[i]->edgelist->nextedge=NULL;
  97. G->vexs[i]->degree=0;
  98. }
  99. for(i=0;i<s;i++){
  100. int head,tail;
  101. scanf("%d %d",&head,&tail);
  102. if(t==0){
  103. for(k=0;k<v;k++){
  104. if(G->vexs[k]->vertex-'0'==head){
  105. EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
  106. for(j=0;j<v;j++){
  107. if(vex[j]-'0'==tail){
  108. node1->endvex=j;
  109. node1->nextedge=G->vexs[k]->edgelist->nextedge;
  110. G->vexs[k]->edgelist->nextedge=node1;
  111. break;
  112. }
  113. }
  114. for(j=0;j<v;j++){
  115. if(G->vexs[j]->vertex-'0'==tail){
  116. EdgeList node2=(EdgeList)malloc(sizeof(struct EdgeNode));
  117. for(l=0;l<v;l++){
  118. if(vex[l]-'0'==head){
  119. node2->endvex=l;
  120. node2->nextedge=G->vexs[j]->edgelist->nextedge;
  121. G->vexs[j]->edgelist->nextedge=node2;
  122. break;
  123. }
  124. }
  125. }
  126. }
  127. }
  128. }
  129. }
  130. else if(t==1){
  131. for(k=0;k<v;k++){
  132. if(G->vexs[k]->vertex-'0'==head){
  133. EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
  134. for(j=0;j<v;j++){
  135. if(vex[j]-'0'==tail){
  136. for(l=0;l<G->vcount;l++){
  137. if(G->vexs[l]->vertex-'0'==tail){
  138. G->vexs[l]->degree++;
  139. }
  140. }
  141. node1->endvex=j;
  142. node1->nextedge=G->vexs[k]->edgelist->nextedge;
  143. G->vexs[k]->edgelist->nextedge=node1;
  144. break;
  145. }
  146. }
  147. }
  148. }
  149. }
  150. }
  151. return G;
  152. }
  153. void printGraphLit( GraphList *G)
  154. {
  155. /*输出邻接表,输出格式:顶点->邻接顶点编号->...*/
  156. int i;
  157. for(i=0;i<G->vcount;i++){
  158. printf("%c->",G->vexs[i]->vertex);
  159. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  160. while(tp->nextedge!=NULL){
  161. printf("%d->",tp->endvex);
  162. tp=tp->nextedge;
  163. }
  164. printf("%d\n",tp->endvex);
  165. }
  166. }
  167. /*第三关 完成图的广度遍历(周游),可根据需要添加自定义函数
  168. */
  169. int visited[N]={0};
  170. void BFS_list(GraphList *G)
  171. {
  172. int i,j;
  173. printf("%c ",G->vexs[0]->vertex);
  174. visited[0]=1;
  175. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  176. while(tp->nextedge!=NULL){
  177. printf("%d ",tp->endvex);
  178. visited[tp->endvex]=1;
  179. tp=tp->nextedge;
  180. }
  181. printf("%d ",tp->endvex);
  182. visited[tp->endvex]=1;
  183. for(i=N-1;i>=0;i--){
  184. if(visited[i]==1){
  185. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  186. while(tp->nextedge!=NULL && visited[tp->endvex]==0){
  187. printf("%d ",tp->endvex);
  188. visited[tp->endvex]=1;
  189. tp=tp->nextedge;
  190. }
  191. }
  192. }
  193. }
  194. /*第四关 完成图的深度遍历(周游),可根据需要添加自定义函数
  195. */
  196. int visited2[N];
  197. void DFS_list(GraphList *G)
  198. {
  199. int i,j,k;
  200. for(i=0;i<N;i++){
  201. visited2[i]=0;
  202. }
  203. printf("%c ",G->vexs[0]->vertex);
  204. visited2[0]=1;
  205. EdgeList tp=G->vexs[0]->edgelist->nextedge;
  206. printf("%d ",tp->endvex);
  207. visited2[tp->endvex]=1;
  208. int num=4;
  209. while(1){
  210. for(i=0;i<G->vcount;i++){
  211. if(G->vexs[i]->vertex-'0'==tp->endvex){
  212. EdgeList tp2=G->vexs[i]->edgelist->nextedge;
  213. if(visited2[tp2->endvex]==0){
  214. tp=tp2;
  215. printf("%d ",tp2->endvex);
  216. visited2[tp2->endvex]=1;
  217. break;
  218. }
  219. else if(visited2[tp2->endvex]==1){
  220. for(tp2=tp2->nextedge;tp2!=NULL;tp2=tp2->nextedge){
  221. if(visited2[tp2->endvex]==0){
  222. tp=tp2;
  223. printf("%d ",tp2->endvex);
  224. visited2[tp2->endvex]=1;
  225. break;
  226. }
  227. }
  228. }
  229. }
  230. }
  231. int count=0;
  232. for(i=0;i<N;i++){
  233. if(visited2[i]==1) count++;
  234. }
  235. if(count==G->vcount) break;
  236. }
  237. }

第5关:拓扑排序

本关任务:编写一个能输出有向无环图的拓扑排序的函数。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 6
  4. #define MAX 100
  5. typedef struct {
  6. int vex;
  7. int shortweight;
  8. }ShortWeight;
  9. typedef struct QueueNode{
  10. int val;
  11. struct QueueNode* next;
  12. }QueueNode;
  13. typedef struct Queue{
  14. QueueNode *head;
  15. QueueNode *tail;
  16. }Queue;
  17. //邻接矩阵数据结构
  18. typedef struct{
  19. int vcount;//顶点数
  20. int type ;//0 无向图,1 有向图
  21. char vexs[N] ; // 顶点信息
  22. int arcs[N][N]; //关系矩阵
  23. } GraphMatrix;
  24. //邻接表数据结构
  25. struct EdgeNode { //边表中的结点
  26. int endvex; //相邻顶点在顶点表中下标
  27. int weight; //边的权
  28. struct EdgeNode * nextedge; //链字段
  29. };
  30. typedef struct EdgeNode * EdgeList;
  31. typedef struct
  32. {
  33. char vertex; //记录顶点信息
  34. int degree;//用于记录顶点的入度,在拓扑排序时需使用
  35. EdgeList edgelist; //指向边表的指针
  36. } VexNode;
  37. typedef struct{
  38. VexNode *vexs[N]; //N个顶点
  39. int type ;//0 无向图,1 有向图
  40. int vcount;//顶点数
  41. } GraphList;
  42. /*第一关 完成图初始化-邻接矩阵
  43. */
  44. GraphMatrix *initGraphMatrix( )
  45. {
  46. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  47. 输出邻接矩阵,不需要考虑输入的数字非法情况,不输入顶点的信息*/
  48. GraphMatrix *G;
  49. G=(GraphMatrix *)malloc(sizeof(GraphMatrix));
  50. int t,v,s;
  51. scanf("%d %d %d",&t,&v,&s);
  52. G->vcount=v;
  53. G->type=t;
  54. int i,j;
  55. for(i=0;i<N;i++){
  56. for(j=0;j<N;j++){
  57. G->arcs[i][j]=0;
  58. }
  59. }
  60. int head,tail;
  61. if(t==0)
  62. for(i=0;i<N;i++){
  63. scanf("%d %d",&head,&tail);
  64. G->arcs[head][tail]=1;
  65. G->arcs[tail][head]=1;
  66. }
  67. if(t==1){
  68. for(i=0;i<N;i++){
  69. scanf("%d %d",&head,&tail);
  70. G->arcs[head][tail]=1;
  71. }
  72. }
  73. return G;
  74. }
  75. /*第二关 完成图初始化-邻接表,并完成输出图的邻接表函数
  76. */
  77. GraphList *initGraphList()
  78. {
  79. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  80. 输出邻接表。不需考虑输入的数字非法情况,输入顶点的信息*/
  81. GraphList *G=(GraphList*)malloc(sizeof(GraphList));
  82. int t,v,s;
  83. scanf("%d%d%d",&t,&v,&s);
  84. G->vcount=v;
  85. G->type=t;
  86. int i,j,k,l;
  87. char vex[N];
  88. char ch=getchar();
  89. for(i=0;i<v;i++){
  90. scanf("%c",&vex[i]);
  91. }
  92. for(i=0;i<v;i++){
  93. G->vexs[i]=(VexNode *)malloc(sizeof(VexNode));
  94. G->vexs[i]->vertex=vex[i];
  95. G->vexs[i]->edgelist=(EdgeList)malloc(sizeof(struct EdgeNode));
  96. G->vexs[i]->edgelist->nextedge=NULL;
  97. G->vexs[i]->degree=0;
  98. }
  99. for(i=0;i<s;i++){
  100. int head,tail;
  101. scanf("%d %d",&head,&tail);
  102. if(t==0){
  103. for(k=0;k<v;k++){
  104. if(G->vexs[k]->vertex-'0'==head){
  105. EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
  106. for(j=0;j<v;j++){
  107. if(vex[j]-'0'==tail){
  108. node1->endvex=j;
  109. node1->nextedge=G->vexs[k]->edgelist->nextedge;
  110. G->vexs[k]->edgelist->nextedge=node1;
  111. break;
  112. }
  113. }
  114. for(j=0;j<v;j++){
  115. if(G->vexs[j]->vertex-'0'==tail){
  116. EdgeList node2=(EdgeList)malloc(sizeof(struct EdgeNode));
  117. for(l=0;l<v;l++){
  118. if(vex[l]-'0'==head){
  119. node2->endvex=l;
  120. node2->nextedge=G->vexs[j]->edgelist->nextedge;
  121. G->vexs[j]->edgelist->nextedge=node2;
  122. break;
  123. }
  124. }
  125. }
  126. }
  127. }
  128. }
  129. }
  130. else if(t==1){
  131. for(k=0;k<v;k++){
  132. if(G->vexs[k]->vertex-'0'==head){
  133. EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
  134. for(j=0;j<v;j++){
  135. if(vex[j]-'0'==tail){
  136. for(l=0;l<G->vcount;l++){
  137. if(G->vexs[l]->vertex-'0'==tail){
  138. G->vexs[l]->degree++;
  139. }
  140. }
  141. node1->endvex=j;
  142. node1->nextedge=G->vexs[k]->edgelist->nextedge;
  143. G->vexs[k]->edgelist->nextedge=node1;
  144. break;
  145. }
  146. }
  147. }
  148. }
  149. }
  150. }
  151. return G;
  152. }
  153. void printGraphLit( GraphList *G)
  154. {
  155. /*输出邻接表,输出格式:顶点->邻接顶点编号->...*/
  156. int i;
  157. for(i=0;i<G->vcount;i++){
  158. printf("%c->",G->vexs[i]->vertex);
  159. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  160. while(tp->nextedge!=NULL){
  161. printf("%d->",tp->endvex);
  162. tp=tp->nextedge;
  163. }
  164. printf("%d\n",tp->endvex);
  165. }
  166. }
  167. /*第三关 完成图的广度遍历(周游),可根据需要添加自定义函数
  168. */
  169. int visited[N]={0};
  170. void BFS_list(GraphList *G)
  171. {
  172. int i,j;
  173. printf("%c ",G->vexs[0]->vertex);
  174. visited[0]=1;
  175. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  176. while(tp->nextedge!=NULL){
  177. printf("%d ",tp->endvex);
  178. visited[tp->endvex]=1;
  179. tp=tp->nextedge;
  180. }
  181. printf("%d ",tp->endvex);
  182. visited[tp->endvex]=1;
  183. for(i=N-1;i>=0;i--){
  184. if(visited[i]==1){
  185. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  186. while(tp->nextedge!=NULL && visited[tp->endvex]==0){
  187. printf("%d ",tp->endvex);
  188. visited[tp->endvex]=1;
  189. tp=tp->nextedge;
  190. }
  191. }
  192. }
  193. }
  194. /*第四关 完成图的深度遍历(周游),可根据需要添加自定义函数
  195. */
  196. int visited2[N];
  197. void DFS_list(GraphList *G)
  198. {
  199. int i,j,k;
  200. for(i=0;i<N;i++){
  201. visited2[i]=0;
  202. }
  203. printf("%c ",G->vexs[0]->vertex);
  204. visited2[0]=1;
  205. EdgeList tp=G->vexs[0]->edgelist->nextedge;
  206. printf("%d ",tp->endvex);
  207. visited2[tp->endvex]=1;
  208. int num=4;
  209. while(1){
  210. for(i=0;i<G->vcount;i++){
  211. if(G->vexs[i]->vertex-'0'==tp->endvex){
  212. EdgeList tp2=G->vexs[i]->edgelist->nextedge;
  213. if(visited2[tp2->endvex]==0){
  214. tp=tp2;
  215. printf("%d ",tp2->endvex);
  216. visited2[tp2->endvex]=1;
  217. break;
  218. }
  219. else if(visited2[tp2->endvex]==1){
  220. for(tp2=tp2->nextedge;tp2!=NULL;tp2=tp2->nextedge){
  221. if(visited2[tp2->endvex]==0){
  222. tp=tp2;
  223. printf("%d ",tp2->endvex);
  224. visited2[tp2->endvex]=1;
  225. break;
  226. }
  227. }
  228. }
  229. }
  230. }
  231. int count=0;
  232. for(i=0;i<N;i++){
  233. if(visited2[i]==1) count++;
  234. }
  235. if(count==G->vcount) break;
  236. }
  237. }
  238. /*第五关 生成图的拓扑排序,可根据需要添加自定义函数
  239. */
  240. void QueueInit(Queue* pq) {
  241. pq->head = pq->tail = NULL;
  242. }
  243. void QueuePush(Queue* pq, int x) {
  244. QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
  245. newnode->val = x;
  246. newnode->next = NULL;
  247. if (pq->tail == NULL) {
  248. pq->head = pq->tail = newnode;
  249. }
  250. else {
  251. pq->tail->next = newnode;
  252. pq->tail = newnode;
  253. }
  254. }
  255. void QueuePop(Queue* pq) {
  256. if (pq->head->next == NULL) {
  257. pq->head = pq->tail = NULL;
  258. }
  259. else {
  260. QueueNode* next = pq->head->next;
  261. pq->head = next;
  262. }
  263. }
  264. int QueueFront(Queue* pq) {
  265. return pq->head->val;
  266. }
  267. int QueueEmpty(Queue* pq) {
  268. return pq->head == NULL;
  269. }
  270. void Top_list(GraphList* G)
  271. {
  272. Queue* Q=(Queue *)malloc(sizeof(Queue));
  273. QueueInit(Q);
  274. int i;
  275. int deg[N];
  276. for (i = 0; i < N; i++) {
  277. deg[i] = 0;
  278. }
  279. for (i = 0; i < N; i++) {
  280. deg[i] = G->vexs[i]->degree;
  281. }
  282. for (i = 0; i < N; i++) {
  283. if (deg[i] == 0) {
  284. QueuePush(Q, i);
  285. }
  286. }
  287. while (!QueueEmpty(Q)) {
  288. int j = QueueFront(Q);
  289. printf("%d ", j);
  290. QueuePop(Q);
  291. EdgeList p;
  292. p = G->vexs[j]->edgelist->nextedge;
  293. while (p != NULL) {
  294. deg[p->endvex]--;
  295. if (deg[p->endvex] == 0) {
  296. QueuePush(Q, p->endvex);
  297. }
  298. p = p->nextedge;
  299. }
  300. }
  301. }

第6关:prim算法生成最小生成树

本关任务:实现prim算法生成最小生成树。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 6
  4. #define MAX 100
  5. typedef struct {
  6. int vex;
  7. int shortweight;
  8. }ShortWeight;
  9. typedef struct QueueNode{
  10. int val;
  11. struct QueueNode* next;
  12. }QueueNode;
  13. typedef struct Queue{
  14. QueueNode *head;
  15. QueueNode *tail;
  16. }Queue;
  17. //邻接矩阵数据结构
  18. typedef struct{
  19. int vcount;//顶点数
  20. int type ;//0 无向图,1 有向图
  21. char vexs[N] ; // 顶点信息
  22. int arcs[N][N]; //关系矩阵
  23. } GraphMatrix;
  24. //邻接表数据结构
  25. struct EdgeNode { //边表中的结点
  26. int endvex; //相邻顶点在顶点表中下标
  27. int weight; //边的权
  28. struct EdgeNode * nextedge; //链字段
  29. };
  30. typedef struct EdgeNode * EdgeList;
  31. typedef struct
  32. {
  33. char vertex; //记录顶点信息
  34. int degree;//用于记录顶点的入度,在拓扑排序时需使用
  35. EdgeList edgelist; //指向边表的指针
  36. } VexNode;
  37. typedef struct{
  38. VexNode *vexs[N]; //N个顶点
  39. int type ;//0 无向图,1 有向图
  40. int vcount;//顶点数
  41. } GraphList;
  42. /*第一关 完成图初始化-邻接矩阵
  43. */
  44. GraphMatrix *initGraphMatrix( )
  45. {
  46. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  47. 输出邻接矩阵,不需要考虑输入的数字非法情况,不输入顶点的信息*/
  48. GraphMatrix *G;
  49. G=(GraphMatrix *)malloc(sizeof(GraphMatrix));
  50. int t,v,s;
  51. scanf("%d %d %d",&t,&v,&s);
  52. G->vcount=v;
  53. G->type=t;
  54. int i,j;
  55. for(i=0;i<N;i++){
  56. for(j=0;j<N;j++){
  57. G->arcs[i][j]=0;
  58. }
  59. }
  60. int head,tail;
  61. if(t==0)
  62. for(i=0;i<N;i++){
  63. scanf("%d %d",&head,&tail);
  64. G->arcs[head][tail]=1;
  65. G->arcs[tail][head]=1;
  66. }
  67. if(t==1){
  68. for(i=0;i<N;i++){
  69. scanf("%d %d",&head,&tail);
  70. G->arcs[head][tail]=1;
  71. }
  72. }
  73. return G;
  74. }
  75. GraphList* initGraphList()
  76. {
  77. /*第一行输入图的类型、图的顶点数和边数,第二行输入各条边的两顶点的编号,按顶点编号从小到大的顺序输入。
  78. 输出邻接表。不需考虑输入的数字非法情况,输入顶点的信息*/
  79. GraphList* G = (GraphList*)malloc(sizeof(GraphList));
  80. int t, v, s;
  81. scanf("%d%d%d", &t, &v, &s);
  82. G->vcount = v;
  83. G->type = t;
  84. int i, j, k, l;
  85. char vex[N];
  86. char ch = getchar();
  87. for (i = 0; i < v; i++) {
  88. scanf("%c", &vex[i]);
  89. }
  90. for (i = 0; i < v; i++) {
  91. G->vexs[i] = (VexNode*)malloc(sizeof(VexNode));
  92. G->vexs[i]->vertex = vex[i];
  93. G->vexs[i]->edgelist = (EdgeList)malloc(sizeof(struct EdgeNode));
  94. G->vexs[i]->edgelist->nextedge = NULL;
  95. }
  96. for (i = 0; i < s; i++) {
  97. int head, tail,w;
  98. scanf("%d %d %d", &head, &tail,&w);
  99. if (t == 0) {
  100. for (k = 0; k < v; k++) {
  101. if (G->vexs[k]->vertex - '0' == head) {
  102. EdgeList node1 = (EdgeList)malloc(sizeof(struct EdgeNode));
  103. for (j = 0; j < v; j++) {
  104. if (vex[j] - '0' == tail) {
  105. node1->weight = w;
  106. node1->endvex = j;
  107. node1->nextedge = G->vexs[k]->edgelist->nextedge;
  108. G->vexs[k]->edgelist->nextedge = node1;
  109. break;
  110. }
  111. }
  112. for (j = 0; j < v; j++) {
  113. if (G->vexs[j]->vertex - '0' == tail) {
  114. EdgeList node2 = (EdgeList)malloc(sizeof(struct EdgeNode));
  115. for (l = 0; l < v; l++) {
  116. if (vex[l] - '0' == head) {
  117. node2->weight = w;
  118. node2->endvex = l;
  119. node2->nextedge = G->vexs[j]->edgelist->nextedge;
  120. G->vexs[j]->edgelist->nextedge = node2;
  121. break;
  122. }
  123. }
  124. }
  125. }
  126. }
  127. }
  128. }
  129. }
  130. return G;
  131. }
  132. /*第三关 完成图的广度遍历(周游),可根据需要添加自定义函数
  133. */
  134. int visited[N]={0};
  135. void BFS_list(GraphList *G)
  136. {
  137. int i,j;
  138. printf("%c ",G->vexs[0]->vertex);
  139. visited[0]=1;
  140. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  141. while(tp->nextedge!=NULL){
  142. printf("%d ",tp->endvex);
  143. visited[tp->endvex]=1;
  144. tp=tp->nextedge;
  145. }
  146. printf("%d ",tp->endvex);
  147. visited[tp->endvex]=1;
  148. for(i=N-1;i>=0;i--){
  149. if(visited[i]==1){
  150. EdgeList tp=G->vexs[i]->edgelist->nextedge;
  151. while(tp->nextedge!=NULL && visited[tp->endvex]==0){
  152. printf("%d ",tp->endvex);
  153. visited[tp->endvex]=1;
  154. tp=tp->nextedge;
  155. }
  156. }
  157. }
  158. }
  159. /*第四关 完成图的深度遍历(周游),可根据需要添加自定义函数
  160. */
  161. int visited2[N];
  162. void DFS_list(GraphList *G)
  163. {
  164. int i,j,k;
  165. for(i=0;i<N;i++){
  166. visited2[i]=0;
  167. }
  168. printf("%c ",G->vexs[0]->vertex);
  169. visited2[0]=1;
  170. EdgeList tp=G->vexs[0]->edgelist->nextedge;
  171. printf("%d ",tp->endvex);
  172. visited2[tp->endvex]=1;
  173. int num=4;
  174. while(1){
  175. for(i=0;i<G->vcount;i++){
  176. if(G->vexs[i]->vertex-'0'==tp->endvex){
  177. EdgeList tp2=G->vexs[i]->edgelist->nextedge;
  178. if(visited2[tp2->endvex]==0){
  179. tp=tp2;
  180. printf("%d ",tp2->endvex);
  181. visited2[tp2->endvex]=1;
  182. break;
  183. }
  184. else if(visited2[tp2->endvex]==1){
  185. for(tp2=tp2->nextedge;tp2!=NULL;tp2=tp2->nextedge){
  186. if(visited2[tp2->endvex]==0){
  187. tp=tp2;
  188. printf("%d ",tp2->endvex);
  189. visited2[tp2->endvex]=1;
  190. break;
  191. }
  192. }
  193. }
  194. }
  195. }
  196. int count=0;
  197. for(i=0;i<N;i++){
  198. if(visited2[i]==1) count++;
  199. }
  200. if(count==G->vcount) break;
  201. }
  202. }
  203. /*第五关 生成图的拓扑排序,可根据需要添加自定义函数
  204. */
  205. void QueueInit(Queue* pq) {
  206. pq->head = pq->tail = NULL;
  207. }
  208. void QueuePush(Queue* pq, int x) {
  209. QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
  210. newnode->val = x;
  211. newnode->next = NULL;
  212. if (pq->tail == NULL) {
  213. pq->head = pq->tail = newnode;
  214. }
  215. else {
  216. pq->tail->next = newnode;
  217. pq->tail = newnode;
  218. }
  219. }
  220. void QueuePop(Queue* pq) {
  221. if (pq->head->next == NULL) {
  222. pq->head = pq->tail = NULL;
  223. }
  224. else {
  225. QueueNode* next = pq->head->next;
  226. pq->head = next;
  227. }
  228. }
  229. int QueueFront(Queue* pq) {
  230. return pq->head->val;
  231. }
  232. int QueueEmpty(Queue* pq) {
  233. return pq->head == NULL;
  234. }
  235. void Top_list(GraphList* G)
  236. {
  237. Queue* Q=(Queue *)malloc(sizeof(Queue));
  238. QueueInit(Q);
  239. int i;
  240. int deg[N];
  241. for (i = 0; i < N; i++) {
  242. deg[i] = 0;
  243. }
  244. for (i = 0; i < N; i++) {
  245. deg[i] = G->vexs[i]->degree;
  246. }
  247. for (i = 0; i < N; i++) {
  248. if (deg[i] == 0) {
  249. QueuePush(Q, i);
  250. }
  251. }
  252. while (!QueueEmpty(Q)) {
  253. int j = QueueFront(Q);
  254. printf("%d ", j);
  255. QueuePop(Q);
  256. EdgeList p;
  257. p = G->vexs[j]->edgelist->nextedge;
  258. while (p != NULL) {
  259. deg[p->endvex]--;
  260. if (deg[p->endvex] == 0) {
  261. QueuePush(Q, p->endvex);
  262. }
  263. p = p->nextedge;
  264. }
  265. }
  266. }
  267. /*第六关 prim算法生成最小生成树
  268. */
  269. int GetShortWeight(GraphList* G,ShortWeight *shortw) {
  270. int i;
  271. int min = MAX;
  272. int loc;
  273. for (i = 1; i < G->vcount; i++) {
  274. if (min > shortw[i].shortweight && shortw[i].shortweight != 0) {
  275. min = shortw[i].shortweight;
  276. loc = i;
  277. }
  278. }
  279. return loc;
  280. }
  281. void Prim_list(GraphList* G)
  282. {
  283. int i, j, k;
  284. ShortWeight shortw[10];
  285. for (i = 0; i < 10; i++) {
  286. shortw[i].shortweight = MAX;
  287. }
  288. k = 0;
  289. EdgeList tp = G->vexs[k]->edgelist->nextedge;
  290. while (tp) {
  291. shortw[tp->endvex].shortweight= tp->weight;
  292. shortw[tp->endvex].vex = k;
  293. tp = tp->nextedge;
  294. }
  295. shortw[k].shortweight = 0;
  296. for (i = 0; i < G->vcount - 1; i++) {
  297. k = GetShortWeight(G, shortw);
  298. printf("%d %d\n", shortw[k].vex, k);
  299. shortw[k].shortweight = 0;
  300. EdgeList tp2 = G->vexs[k]->edgelist->nextedge;
  301. while (tp2) {
  302. if (tp2->weight < shortw[tp2->endvex].shortweight) {
  303. shortw[tp2->endvex].shortweight = tp2->weight;
  304. shortw[tp2->endvex].vex = k;
  305. }
  306. tp2 = tp2->nextedge;
  307. }
  308. }
  309. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/756050
推荐阅读
相关标签
  

闽ICP备14008679号