鱼C论坛

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

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

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

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

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

x
#define _CRT_SECURE_NO_WARNINGS 1

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

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

typedef struct EdgeNode {//边结点
        char tail, head;
        EdgeNode* hLink;
        EdgeNode* tLink;
}EdgeNode;

typedef struct VertexNode {//顶点结点
        char data;
        EdgeNode * fstIn;
        EdgeNode * fstOut;
}Vertex;

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

int locateVertex(char x, pGraph G) {
        for (int i = 0; i < G->Vnum; i++) {
                if (G->array[i].data == x) {
                        return i;
                }
        }
        return 0;
}

void createGraph(pGraph G) {//创造又想吐
        int v, a;
        char vertex;
        char tail, head;//分别表示弧的弧头和弧尾
        EdgeNode *q;
        printf("请输入该有向图的顶点数和弧数:");
        scanf("%d %d", &v, &a);
        G->Vnum = v;
        G->ArcNum = a;
        printf("请输入顶点:\n");
        //顶点表的初始化
        for (int i = 0; i < G->Vnum; i++) {
                printf("请输入第%d个顶点的值:", i + 1);
                scanf("%c", &G->array[i].data);
                G->array[i].fstIn = G->array[i].fstOut = NULL;
        }
        printf("建立边表:\n");
        for (int i = 0; i < G->ArcNum; i++) {
                int k, j;
                printf("请输入弧:\n");
                scanf("%c,%c", &tail, &head);
                k = locateVertex(tail, G);
                j = locateVertex(head, G);
                q = (EdgeNode *)malloc(sizeof(EdgeNode));
                q->tail = tail;
                q->head = head;
                q->hLink = G->array[j].fstIn;//此处建议别画图,越画越乱,直接写
                q->tLink = G->array[k].fstOut;
                G->array[k].fstOut = q;
                G->array[j].fstIn = q;
        }
}
void displayGraph(pGraph G) {
        EdgeNode *q;
        EdgeNode *p;
        for (int i = 0; i < G->Vnum; i++) {
                q = G->array[i].fstIn;
                p = G->array[i].fstOut;
                if (!q)
                {
                        printf("%c顶点没有入度!", G->array[i].data);
                }
                else {
                        printf("%c的入度是: \n", G->array[i].data);
                        while (!q)
                        {
                                printf("%c->%c ", q->tail, q->head);
                                q = q->hLink;
                        }
                }
                if (!p) {
                        printf("%c顶点没有出度!", G->array[i].data);
                }
                else {
                        printf("%c的出度是: \n", G->array[i].data);
                        while (!p)
                        {
                                printf("%c->%c", p->tail, p->head);
                                q = q->tLink;
                        }
                }
        }
}
int main() {
        Graph G;
        createGraph(&G);
        displayGraph(&G);
        return 0;
}
以上是我码的代码,但是有个奇葩的问题
就是我在对顶点表初始化的时候就是以下这段
//顶点表的初始化
        for (int i = 0; i < G->Vnum; i++) {
                printf("请输入第%d个顶点的值:", i + 1);
                scanf("%c", &G->array[i].data);
                G->array[i].fstIn = G->array[i].fstOut = NULL;
        }
经过我的调试,我发现进入for循环第一个scanf直接不执行.而且,我原本定的顶点数是3个顶点
但是第一个和第三个scanf直接跳过,只输入了一次,人晕了,希望有大佬能帮帮我。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

typedef struct EdgeNode {//边结点
        char tail, head;
        EdgeNode* hLink;
        EdgeNode* tLink;
}EdgeNode;

typedef struct VertexNode {//顶点结点
        char data;
        EdgeNode * fstIn;
        EdgeNode * fstOut;
}Vertex;

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

int locateVertex(char x, pGraph G) {
        for (int i = 0; i < G->Vnum; i++) {
                if (G->array[i].data == x) {
                        return i;
                }
        }
        return 0;
}

void createGraph(pGraph G) {//创造又想吐
        int v, a;
        char vertex;
        char tail, head;//分别表示弧的弧头和弧尾
        EdgeNode *q;
        printf("请输入该有向图的顶点数和弧数:");
        scanf("%d %d", &v, &a);
        G->Vnum = v;
        G->ArcNum = a;
        printf("请输入顶点:\n");
        //顶点表的初始化
        for (int i = 0; i < G->Vnum; i++) {
                getchar();
                scanf("%c", &G->array[i].data);
                G->array[i].fstIn = G->array[i].fstOut = NULL;
        }
        printf("建立边表:\n");
        for (int i = 0; i < G->ArcNum; i++) {
                int k, j;
                printf("请输入弧:\n");
                getchar();
                scanf("%c %c", &tail, &head);
                k = locateVertex(tail, G);
                j = locateVertex(head, G);
                q = (EdgeNode *)malloc(sizeof(EdgeNode));
                q->tail = tail;
                q->head = head;
                q->hLink = G->array[j].fstIn;//此处建议别画图,越画越乱,直接写
                q->tLink = G->array[k].fstOut;
                G->array[k].fstOut = q;
                G->array[j].fstIn = q;
        }
}
void displayGraph(pGraph G) {
        EdgeNode *q;
        EdgeNode *p;
        for (int i = 0; i < G->Vnum; i++) {
                q = G->array[i].fstIn;
                p = G->array[i].fstOut;
                if (!q)
                {
                        printf("%c顶点没有入度!\n", G->array[i].data);
                }
                else {
                        printf("\n%c的入度是:\n", G->array[i].data);
                        while (q)
                        {
                                printf("%c->%c ", q->tail, q->head);
                                q = q->hLink;
                        }
                }
                if (!p) {
                        printf("%c顶点没有出度!", G->array[i].data);
                }
                else {
                        printf("\n%c的出度是:\n", G->array[i].data);
                        while (p)
                        {
                                printf("%c->%c ", p->tail, p->head);
                                p = p->tLink;
                        }
                }
        }
}
int main() {
        Graph G;
        createGraph(&G);
        displayGraph(&G);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 12:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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