-3

我很难弄清楚如何将元素添加到链表节点内的列表属性中,尤其是如何设置指针。

我有一个这样的结构:

typedef struct Node
{
    int value;
    struct Node *elements;
    struct Node *next;
}Node;
 Node *mainlist;
 Node *elemlist;

我希望能够在主列表中找到一个特定的节点,并将 elemlist 中的所有元素添加到该节点 *elements 中。

我有这个函数,它接受主列表和一个要检查的值:

void add_elements(Node *mainlist, int value)
{
    Node *ptr = mainlist;
    Node *ptr2 = elemlist;
    while(ptr != NULL)
    {
            if(value == ptr->value)
            {
                    while(ptr2 != NULL)
                    {
                            Node *newNode = malloc(sizeof(Node));
                            newNode->value = ptr2->value;
                            newNode->next = ptr->elements;
                            ptr->elements = newNode;
                            ptr2 = ptr2->next;
                    }
            }
            ptr = ptr->next;
    }
}

我遇到了分段错误,因此它显然没有将 elemlist 中的元素添加到节点的元素中。我相当肯定我的指针做错了什么。

对此的任何帮助将不胜感激。谢谢!

4

4 回答 4

1

我认为这:

     Node->value = ptr2->value;

应该是这样的:

    newNode->value = ptr2->value;
于 2012-10-24T07:52:54.710 回答
1

在为您的 newNode 调用 malloc 之后,您应该为该 newNode 初始化valuenext项目

但是你正在改变Node->value但你应该改变newNode->value


您必须替换Node->value = ptr2->value;newNode->value = ptr2->value;

于 2012-10-24T08:00:29.020 回答
1

看起来您的 seg 错误将在您的内部 while 循环执行后出现,因此 ptr2 指向其链表的末尾。然后,如果再次执行第二个循环,您将访问无效内存。尝试在内循环之后重置 ptr2 。

所以喜欢

void add_elements(Node *mainlist, int value)
{
    Node *ptr = mainlist;
    Node *ptr2 = elemlist;
    Node *tmp = ptr2;
    while(ptr != NULL)
    {
            if(value == ptr->value)
            {
                    while(ptr2 != NULL)
                    {
                            Node *newNode = malloc(sizeof(Node));
                            newNode->value = ptr2->value;
                            newNode->next = ptr->elements;
                            ptr->elements = newNode;
                            ptr2 = ptr2->next;
                    }
                     ptr2 = tmp;
            }
            ptr = ptr->next;
    }
}
于 2012-10-24T08:00:43.223 回答
0

不知道为什么你有一个 segFault 但那是因为你正在使用未定义的指针地址设置 newNode->next (或不设置)。

typedef struct Node{
int value;
struct Node *elements;
struct Node *next;

}节点;

节点 *mainlist; 节点 *elemlist;

void add_elements(Node* mainlist, int value){
    Node* ptr  = mainlist;
    Node* ptr2 = elemlist;
    while(ptr != NULL)
    {
        printf("* %u\n", ptr->value);
        if(value == ptr->value)
        {
            while(ptr2 != NULL)
            {
                Node *newNode = malloc(sizeof(Node));
                newNode->value  = ptr2->value;
                newNode->next   = ptr->elements;
                ptr->elements   = newNode;
                ptr2            = ptr2->next;
            }
        }
        ptr = ptr->next;
    }
}

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

        Node* node = calloc(1, sizeof(Node));
        Node* node2 = calloc(1, sizeof(Node));
        node->next = node2;
        node2->value = 17;
        add_elements(node, 2);
    }
    return 0;
}

正在工作(即使我在函数之外添加了元素;),但将其作为练习)

于 2012-10-24T08:06:23.270 回答