【问题标题】:C - Adding to linked list within a list node [closed]C - 添加到列表节点内的链表[关闭]
【发布时间】:2012-10-24 07:48:30
【问题描述】:

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

我有一个这样的结构:

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 中的元素添加到节点的元素中。我相当肯定我的指针做错了什么。

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

【问题讨论】:

  • 这是Node->value = ptr2->value;的实际代码不会编译。
  • NodeSymTblNode 的使用似乎也不一致 - 我怀疑这是实际代码,这使得诊断问题变得困难/不可能。如果 OP 学会使用调试器来解决这些琐碎的问题,它也会更快/更容易。
  • 如果你通过你的编译器运行它,应该有几个警告和错误。先解决这些问题,然后再询问。
  • 当您遇到分段错误时,您应该在调试器中运行您的程序。这将帮助您找到问题在哪里,还可以让您检查变量以帮助您了解为什么它可能会崩溃。
  • 1) mainlist 函数参数与全局变量同名。这是(至少)一个坏习惯。 2) 你可以通过使用 for() 循环而不是 while() 循环来大大简化代码。 3)您可以通过替换if(eq){blabla} by if (!eq) continue 来进一步简化; blabla` 4)您的内部循环以相反的顺序复制elemlist,并在任何现有元素之前。 5)如果值是唯一的,则可以在处理完第一个匹配的元素后跳出外循环。

标签: c linked-list nodes


【解决方案1】:

我认为:

     Node->value = ptr2->value;

应该是这样的:

    newNode->value = ptr2->value;

【讨论】:

  • 这将导致编译失败,而不是分段错误。
【解决方案2】:

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

但是您正在更改Node->value,但您应该更改newNode->value


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

【讨论】:

    【解决方案3】:

    看起来你的 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;
        }
    }
    

    【讨论】:

    • 或者你可以简单地移动节点 *ptr2 = elemlist;在外部 while 内部,因此它在每次执行时都会被初始化
    【解决方案4】:

    不知道为什么你有一个 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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2012-04-26
      • 2021-06-11
      相关资源
      最近更新 更多