我很难弄清楚如何将元素添加到链表中节点内的列表属性,特别是如何设置指针。
我有一个像这样的结构:
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中的元素添加到节点的元素中。我很确定我的指针做错了。
对此的任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
我想这个:
Node->value = ptr2->value;
应该是这样的:
newNode->value = ptr2->value;
答案 1 :(得分:1)
在为newNode调用malloc之后,您应该初始化该newNode的value
和next
项
但您要更改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;
}
正在工作(即使我已在函数外添加了元素;),但将其作为练习)