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

时间:2012-10-24 07:48:30

标签: c linked-list nodes

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

我有一个像这样的结构:

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

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

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

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 个答案:

答案 0 :(得分:1)

我想这个:

     Node->value = ptr2->value;

应该是这样的:

    newNode->value = ptr2->value;

答案 1 :(得分:1)

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

但您要更改Node->value,但应更改newNode->value


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

答案 2 :(得分: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;
    }
}

答案 3 :(得分:0)

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

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

}节点;

节点*主列表; Node * 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;
}

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