C-添加到列表节点内的链接列表

C-添加到列表节点内的链接列表,c,linked-list,nodes,C,Linked List,Nodes,我很难理解如何将元素添加到链表中节点内的列表属性中,尤其是如何设置指针 我有一个这样的结构: typedef struct Node { int value; struct Node *elements; struct Node *next; }Node; Node *mainlist; Node *elemlist; 我希望能够在mainlist中找到一个特定的节点,并将elemlist中的所有元素添加到该节点*元素中 我有一个函数,它接收mainlist和一个要

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

我有一个这样的结构:

typedef struct Node
{
    int value;
    struct Node *elements;
    struct Node *next;
}Node;
 Node *mainlist;
 Node *elemlist;
我希望能够在mainlist中找到一个特定的节点,并将elemlist中的所有元素添加到该节点*元素中

我有一个函数,它接收mainlist和一个要检查的值:

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中的元素添加到节点的元素中。我相当肯定我的指针有问题

在此方面的任何帮助都将不胜感激。谢谢大家!

我认为:

     Node->value = ptr2->value;
应该是这样的:

    newNode->value = ptr2->value;

在为新节点调用malloc之后,应立即初始化该新节点的
下一个

但是您正在更改
节点->值
,但是您应该更改
新节点->值



必须替换
Node->value=ptr2->value带有
newNode->value=ptr2->value

看起来在执行内部while循环之后,seg故障将出现,因此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;
    }
}

不知道为什么会出现segFault,但这是因为您正在使用未定义的指针地址设置newNode->next(或不设置)

typedef struct Node{
int value;
struct Node *elements;
struct Node *next;
}节点

节点*主列表; 节点*元素列表

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;
}

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

这是实际代码吗
无法编译。
节点
符号节点
的使用似乎不一致-我怀疑这是实际代码,这使得诊断问题变得困难/不可能。如果OP学会使用调试器来处理这些琐碎的问题,它也会更快/更容易。如果您在编译器中运行调试器,应该会出现一些警告和错误。首先修复这些问题,然后再次询问。当出现分段错误时,应在调试器中运行程序。这将帮助您找到问题所在,还可以让您检查变量以帮助您理解它可能崩溃的原因。1)mainlist函数参数与全局变量同名。这(至少)是个坏习惯。2) 通过使用for()循环而不是while()循环,可以大大简化代码。3) 通过将
if(eq){blabla}替换为
if(!eq)continue,可以进一步简化;blabla`4)您的内部循环以相反的顺序在任何现有元素之前复制elemlist。5) 如果该值是唯一的,您可以在处理第一个匹配元素后跳出外部循环。这将导致编译失败,而不是分段错误。或者您可以简单地移动节点*ptr2=elemlist;在外部while中,因此每次执行时都会初始化它