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中,因此每次执行时都会初始化它