c - 边的链接列表

标签 c graph linked-list adjacency-list

我正在使用邻接表来构造有向图。我的顶点工作正常,但当涉及到使顶点具有多个边时,我遇到了麻烦。我也不确定如何正确遍历多个边缘以打印邻接列表。我目前所遇到的情况导致了段错误,但我想首先弄清楚如何正确构建列表。我将包括主文件、头文件、测试数据和我收到的输出。如果需要,我可以发布其他两个函数。我觉得问题发生的代码部分就在我调用 adjListLocate 两次并且正在处理边缘之后。我正在尝试创建一条新边并让它指向旧边,然后将顶点指向新边,但这没有发生。

main.c

#include "my.h"

int main (int argc, char* argv[])
{



VERTEX *adjList;
adjList  = (VERTEX*)calloc(26, sizeof(VERTEX));
//adjList = malloc(sizeof(VERTEX)*26);
FILE* p;
char a;
char b;
int check1 = 0;
int check2 = 0;
int size = 0;
int i;
int aloc = 0;
int bloc = 0;
//Statements





if (argc != 2)
{
    fprintf(stderr, "Usage: %s file\n", argv[0]);
    return 1;
}

if ((p = fopen(argv[1], "r")) == 0)
{
    fprintf(stderr, "Failed to open file %s for reading \n", argv[1]);
    return 1;
}




while(fscanf(p," %c %c", &a, &b) == 2)  
{
printf("a: %c b: %c\n",a,b);

    check1 = adjListSearch(a,size,adjList);

    if(check1==1)
    {
        printf("Adding a = %c\n", a);
        adjList[size++].c = a;  
    }   
    check2 = adjListSearch(b,size,adjList);
    if(check2==1)
    {
        printf("Adding b = %c\n", b);
        adjList[size++].c = b;
    }

    aloc = adjListLocate(a,size,adjList);
    bloc = adjListLocate(b,size,adjList);

EDGE* e = (EDGE*)malloc(sizeof(EDGE));
e->v = &adjList[bloc];
if(*&adjList[aloc].p)
    {
    EDGE* f = (EDGE*)malloc(sizeof(EDGE));
    f->v = &adjList[bloc];
    f->q = (*&adjList[aloc]).p;
    (*&adjList[aloc]).p = f;

    printf("Edge Test: %c %c %c\n", f->v->c, f->q->v->c, f->q->v->c);
    }
else
{
(*&adjList[aloc]).p = e;
e->q = NULL;
}



}
//End While

printf("Size: %d\n", size);

for(i=0;i<size;i++)
{
printf(" %c", adjList[i].c);
    if(adjList[i].p)
    {
    VERTEX* z = (VERTEX*)malloc(sizeof(VERTEX));
    EDGE* temp = (EDGE*)malloc(sizeof(EDGE));
    z = &adjList[i];
    //printf("Edge: %c\n", z->p->v->c);
    temp = z->p;
        while(temp->v->c)
        {
        printf("test\n");   
        printf("Edge: %c\n", temp->v->c);
        temp = temp->q;
            printf("test2\n");

        }
    }
printf("\n");
}



fclose(p);


return 0;
}
//End main

my.h

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

/* Forward declaration */
struct EDGETAG;

typedef struct
{
    char c;
    bool isVisited;
    struct EDGETAG* p;
} VERTEX;


typedef struct EDGETAG
{
    VERTEX* v;
    struct EDGETAG* q;
} EDGE;


int main (int argc, char* argv[]);

int adjListSearch (char a, int size, VERTEX* adjList);

int adjListLocate (char a, int size, VERTEX* adjList);

数据

A B
C C
E X
C D
C F
C X

示例输出

a: A b: B
empty
Adding a = A
not found B
Adding b = B
a: B b: C
found B
not found C
Adding b = C
a: E b: X
not found E
Adding a = E
not found X
Adding b = X
a: C b: D
found C
not found D
Adding b = D
a: C b: F
found C
not found F
Adding b = F
Edge Test: F D D
a: C b: X
found C
found X
Edge Test: X F F
Size: 7
 Atest
Edge: B
test2
Segmentation fault

边缘测试是我在这里担心的。我希望它说 Edge Test: X F D

最佳答案

if(*&adjList[aloc].p)
{
      EDGE* f = (EDGE*)malloc(sizeof(EDGE));
      f->v = &adjList[bloc];
      f->q = (*&adjList[aloc]).p;
      (*&adjList[aloc]).p = f;

      printf("Edge Test: %c %c %c\n", f->v->c, f->q->v->c, f->q->v->c);
}

上面的代码在我看来是有问题的。因为 *& 是多余的,条件只是

 if(adjList[aloc].p)

那么它总是会给出true,因为你没有用NULL初始化adjList[aloc].p,至少我不'不知道你在哪里做的。当然还有

 printf("Edge Test: %c %c %c\n", f->v->c, f->q->v->c, f->q->v->c);

简单地打印f->q->v->c两次。

关于c - 边的链接列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23140126/

相关文章:

Java处理字符串中的逗号

c++ - 使用查找表在链表中查找圆圈

c++ - 交换链表的最后一个节点将变成无限个-C++

c - Laravel: Controller 发送到 C

c - C中通过套接字发送文件

graph - Common Lisp 中的反转有向图

algorithm - ISOMAP算法中获取邻域大小

正确使用相同操作和不同类型的回调

c - 如何针对细微错误设计软件测试

java - 返回了不正确的 Vector.size()