0

所以在我的代码中我有两个结构。第一个是一个节点,它包含一个 int 值和一个指向另一个节点的指针。第二个结构用于创建一个包含 10 个指针的数组,每个指针指向另一个节点。它还包含 link2,它将用于遍历数组及其指向的所有节点。我正在尝试添加 3 个节点,每个节点都将值 3 添加到数组的第三个索引中。第三个索引中的指针应该指向前 3,然后应该指向后三个,依此类推。当我把 add(a,3) 三次然后打印我得到分段错误。我尝试跟踪代码,但这对我来说仍然没有任何意义,因为我总是以三个节点结束。有人可以指出我的方向吗?谢谢!:)/>

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

struct node
{
    int x;
    struct node *link;
};

struct listofnodes
{
    struct node *alist[10];
    struct node *link2;
};

addFirst(struct listofnodes *a, int num)
{
    struct node *nodeone = (struct node *)malloc(sizeof(struct node));
    nodeone->x = num;
    a->alist[num] = nodeone;
    // printf("IT WENT THROUGH\n");
}

add(struct listofnodes *a, int num)
{
    struct node *current;
    current = a->alist[3];
    struct node *nodeone = (struct node *)malloc(sizeof(struct node));
    nodeone->x = num;
    current->x = 5;
    {
        while (a->alist[3] != NULL)
        {

            if (a->alist[3]->link == NULL)
            {
                a->alist[3]->link = nodeone;
                printf("IT WENT THROUGH\n");
                break;
            }
            a->alist[3] = a->alist[3]->link;
        }
    }
}


main(void)
{
    struct listofnodes *a =
        (struct listofnodes *)malloc(sizeof(struct listofnodes));
    // a->alist[3]=NULL;
    addFirst(a, 3);
    add(a, 3);
    add(a, 3);
    add(a, 5);
}
4

1 回答 1

0

在你的 main() 函数中,你有:

struct listofnodes *a =
    (struct listofnodes *)malloc(sizeof(struct listofnodes));

“a”现在是指向包含随机位置的节点列表大小的内存块的指针。你可能想做类似的事情

a->link2 = NULL;

此外,在您的 add() 函数中,您有...

add(struct listofnodes *a, int num)
{
    struct node *current;
    current = a->alist[3];
    struct node *nodeone = (struct node *)malloc(sizeof(struct node));
    nodeone->x = num;

您有 malloc()d 随机内存并将“num”放入 x,但您需要将 null 放入“link”所在的位置,即

    nodeone->link = NULL;

当您使用 malloc() 创建内存块时,您必须手动确保“链接”成员设置为 NULL - 否则上次使用留下的数字将指向谁知道在哪里......

于 2013-09-16T01:48:46.860 回答