我想创建一个结构,如下图所示,为此,我创建了两个结构。一个用于所有有序顶点,另一个用于相邻的顶点。

struct verticeslist{ //list with all ordered vertices
   int n;
   struct adjacentlist *pointer; //pointer to the list with adjacent vertices
   struct verticeslist *next;
};

struct adjacentlist{ //list with the adjacent vertices
   int n;
   struct adjacentlist *next;
};




然后,使用这些结构,我想使用用户的特定输入来初始化它们。

int main(){

    int i, vertices, links, start;
    struct verticeslist *lv;
    struct adjacentlist *lva;
    lv = (struct verticeslist *)malloc(sizeof(struct verticeslist));

    scanf("%d %d\n%d", &vertices, &links, &start); //save the values to create the list

    for (i=1; i<=vertices; i++){ //create and initialize the list
        lv->n = i;
        lv = lv->next;
    }

    while(lv != NULL){ //print the vertices list
        printf("%d ", lv->n);
        lv = lv->next;
    }

return 0;
}


我尝试运行此程序,但出现段错误错误。为什么?

编辑:
我更改了最后一个代码并了解了问题所在,但是现在我试图构建结构的第二部分,但是我不知道如何跟踪第一个元素,因为我在循环中分配了lv->pointer = lva。程序末尾的lv->pointer将指向另一个结构的最后一个数字(相邻列表)。

scanf("%d ", &input);
while (input != EOF){
    lv = firstvert;
    while (lv != NULL){
        if(lv->n == input){
            scanf("%d\n", &adjacentnum);
            lva = (struct adjacentlist *)malloc(sizeof(struct adjacentlist));
            lva->n = adjacentnum;
            lva->next = NULL;
            lv->pointer = lva;
        }
        lv = lv->next;
    }
    scanf("%d ", &input);
}
free(firstvert);
free(lv);
free(lva);

return 0;

最佳答案

您仅在列表上分配了一个节点,您需要为使用的每个节点分配内存。像这样的东西

for (i=1; i<=vertices; i++){ //create and initialize the list
    lv->n = i;
    lv->next = (struct verticeslist *)malloc(sizeof(struct verticeslist));
    lv = lv->next;
    lv->next = 0;
}


编辑将lv-> next设置添加为null。否则,当您稍后尝试阅读时,仍然会遇到段错误。

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

10-12 20:35