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