鱼C论坛

 找回密码
 立即注册
查看: 3347|回复: 1

数据结构十字链表创建,求大佬帮忙

[复制链接]
发表于 2020-12-7 17:20:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #define _CRT_SECURE_NO_WARNINGS 1

  2. #include<stdio.h>
  3. #include<stdlib.h>

  4. const int MaxVertexNum = 100;//最大的顶点数目

  5. typedef struct EdgeNode {//边结点
  6.         char tail, head;
  7.         EdgeNode* hLink;
  8.         EdgeNode* tLink;
  9. }EdgeNode;

  10. typedef struct VertexNode {//顶点结点
  11.         char data;
  12.         EdgeNode * fstIn;
  13.         EdgeNode * fstOut;
  14. }Vertex;

  15. typedef struct VertexList {
  16.         Vertex array[MaxVertexNum];
  17.         int Vnum, ArcNum; //表示输入的顶点数和弧数
  18. }Graph, *pGraph;

  19. int locateVertex(char x, pGraph G) {
  20.         for (int i = 0; i < G->Vnum; i++) {
  21.                 if (G->array[i].data == x) {
  22.                         return i;
  23.                 }
  24.         }
  25.         return 0;
  26. }

  27. void createGraph(pGraph G) {//创造又想吐
  28.         int v, a;
  29.         char vertex;
  30.         char tail, head;//分别表示弧的弧头和弧尾
  31.         EdgeNode *q;
  32.         printf("请输入该有向图的顶点数和弧数:");
  33.         scanf("%d %d", &v, &a);
  34.         G->Vnum = v;
  35.         G->ArcNum = a;
  36.         printf("请输入顶点:\n");
  37.         //顶点表的初始化
  38.         for (int i = 0; i < G->Vnum; i++) {
  39.                 printf("请输入第%d个顶点的值:", i + 1);
  40.                 scanf("%c", &G->array[i].data);
  41.                 G->array[i].fstIn = G->array[i].fstOut = NULL;
  42.         }
  43.         printf("建立边表:\n");
  44.         for (int i = 0; i < G->ArcNum; i++) {
  45.                 int k, j;
  46.                 printf("请输入弧:\n");
  47.                 scanf("%c,%c", &tail, &head);
  48.                 k = locateVertex(tail, G);
  49.                 j = locateVertex(head, G);
  50.                 q = (EdgeNode *)malloc(sizeof(EdgeNode));
  51.                 q->tail = tail;
  52.                 q->head = head;
  53.                 q->hLink = G->array[j].fstIn;//此处建议别画图,越画越乱,直接写
  54.                 q->tLink = G->array[k].fstOut;
  55.                 G->array[k].fstOut = q;
  56.                 G->array[j].fstIn = q;
  57.         }
  58. }
  59. void displayGraph(pGraph G) {
  60.         EdgeNode *q;
  61.         EdgeNode *p;
  62.         for (int i = 0; i < G->Vnum; i++) {
  63.                 q = G->array[i].fstIn;
  64.                 p = G->array[i].fstOut;
  65.                 if (!q)
  66.                 {
  67.                         printf("%c顶点没有入度!", G->array[i].data);
  68.                 }
  69.                 else {
  70.                         printf("%c的入度是: \n", G->array[i].data);
  71.                         while (!q)
  72.                         {
  73.                                 printf("%c->%c ", q->tail, q->head);
  74.                                 q = q->hLink;
  75.                         }
  76.                 }
  77.                 if (!p) {
  78.                         printf("%c顶点没有出度!", G->array[i].data);
  79.                 }
  80.                 else {
  81.                         printf("%c的出度是: \n", G->array[i].data);
  82.                         while (!p)
  83.                         {
  84.                                 printf("%c->%c", p->tail, p->head);
  85.                                 q = q->tLink;
  86.                         }
  87.                 }
  88.         }
  89. }
  90. int main() {
  91.         Graph G;
  92.         createGraph(&G);
  93.         displayGraph(&G);
  94.         return 0;
  95. }
复制代码

以上是我码的代码,但是有个奇葩的问题
就是我在对顶点表初始化的时候就是以下这段
  1. //顶点表的初始化
  2.         for (int i = 0; i < G->Vnum; i++) {
  3.                 printf("请输入第%d个顶点的值:", i + 1);
  4.                 scanf("%c", &G->array[i].data);
  5.                 G->array[i].fstIn = G->array[i].fstOut = NULL;
  6.         }
复制代码

经过我的调试,我发现进入for循环第一个scanf直接不执行.而且,我原本定的顶点数是3个顶点
但是第一个和第三个scanf直接跳过,只输入了一次,人晕了,希望有大佬能帮帮我。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-7 17:54:18 | 显示全部楼层
本问题已解决
总的来说是scanf 输出字符的时候没有清空键盘缓存区的问题
本来我是已经想到这个低级问题的但是我用了fflush(stdin) 万万没想到 VS是无法支持这个的
然后我用了getchar();
然后最后调试之后,发现原代码还有错,以下是完善之后的
其实原本用的scanf_s的,一直以为是scanf_s的问题,我太菜了
  1. #define _CRT_SECURE_NO_WARNINGS 1

  2. #include<stdio.h>
  3. #include<stdlib.h>

  4. const int MaxVertexNum = 100;//最大的顶点数目

  5. typedef struct EdgeNode {//边结点
  6.         char tail, head;
  7.         EdgeNode* hLink;
  8.         EdgeNode* tLink;
  9. }EdgeNode;

  10. typedef struct VertexNode {//顶点结点
  11.         char data;
  12.         EdgeNode * fstIn;
  13.         EdgeNode * fstOut;
  14. }Vertex;

  15. typedef struct VertexList {
  16.         Vertex array[MaxVertexNum];
  17.         int Vnum, ArcNum; //表示输入的顶点数和弧数
  18. }Graph, *pGraph;

  19. int locateVertex(char x, pGraph G) {
  20.         for (int i = 0; i < G->Vnum; i++) {
  21.                 if (G->array[i].data == x) {
  22.                         return i;
  23.                 }
  24.         }
  25.         return 0;
  26. }

  27. void createGraph(pGraph G) {//创造又想吐
  28.         int v, a;
  29.         char vertex;
  30.         char tail, head;//分别表示弧的弧头和弧尾
  31.         EdgeNode *q;
  32.         printf("请输入该有向图的顶点数和弧数:");
  33.         scanf("%d %d", &v, &a);
  34.         G->Vnum = v;
  35.         G->ArcNum = a;
  36.         printf("请输入顶点:\n");
  37.         //顶点表的初始化
  38.         for (int i = 0; i < G->Vnum; i++) {
  39.                 getchar();
  40.                 scanf("%c", &G->array[i].data);
  41.                 G->array[i].fstIn = G->array[i].fstOut = NULL;
  42.         }
  43.         printf("建立边表:\n");
  44.         for (int i = 0; i < G->ArcNum; i++) {
  45.                 int k, j;
  46.                 printf("请输入弧:\n");
  47.                 getchar();
  48.                 scanf("%c %c", &tail, &head);
  49.                 k = locateVertex(tail, G);
  50.                 j = locateVertex(head, G);
  51.                 q = (EdgeNode *)malloc(sizeof(EdgeNode));
  52.                 q->tail = tail;
  53.                 q->head = head;
  54.                 q->hLink = G->array[j].fstIn;//此处建议别画图,越画越乱,直接写
  55.                 q->tLink = G->array[k].fstOut;
  56.                 G->array[k].fstOut = q;
  57.                 G->array[j].fstIn = q;
  58.         }
  59. }
  60. void displayGraph(pGraph G) {
  61.         EdgeNode *q;
  62.         EdgeNode *p;
  63.         for (int i = 0; i < G->Vnum; i++) {
  64.                 q = G->array[i].fstIn;
  65.                 p = G->array[i].fstOut;
  66.                 if (!q)
  67.                 {
  68.                         printf("%c顶点没有入度!\n", G->array[i].data);
  69.                 }
  70.                 else {
  71.                         printf("\n%c的入度是:\n", G->array[i].data);
  72.                         while (q)
  73.                         {
  74.                                 printf("%c->%c ", q->tail, q->head);
  75.                                 q = q->hLink;
  76.                         }
  77.                 }
  78.                 if (!p) {
  79.                         printf("%c顶点没有出度!", G->array[i].data);
  80.                 }
  81.                 else {
  82.                         printf("\n%c的出度是:\n", G->array[i].data);
  83.                         while (p)
  84.                         {
  85.                                 printf("%c->%c ", p->tail, p->head);
  86.                                 p = p->tLink;
  87.                         }
  88.                 }
  89.         }
  90. }
  91. int main() {
  92.         Graph G;
  93.         createGraph(&G);
  94.         displayGraph(&G);
  95.         return 0;
  96. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 18:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表