我为单向链表的组合2工作。
那是我的节点。
struct node
{
int x;
node *next;
};
那是组合器。
void combine(struct node *go1,struct node *go2)
{
while(go1!=NULL) go1=go1->next;
while(go2!=NULL)
{
go1=(node*)malloc(sizeof(node));
go1->x=go2->x;
go1=(node*)malloc(sizeof(node));
go1=go1->next;
go2=go2->next;
}
}
这是主要功能。
main()
{
struct node *head;
head = (node*)malloc(sizeof(node));
head -> x = 5;
head -> next = (node*)malloc(sizeof(node));
head -> next -> x = 10;
head -> next -> next = (node*)malloc(sizeof(node));
head -> next -> next -> x = 23;
head -> next -> next -> next = NULL;
struct node *head2;
head2 = (node*)malloc(sizeof(node));
head2 -> x = 5;
head2 -> next = (node*)malloc(sizeof(node));
head2 -> next -> x = 13;
head2 -> next -> next = (node*)malloc(sizeof(node));
head2 -> next -> next -> x = 31;
head2 -> next -> next -> next = NULL;
print(head);
combine(head,head2);
print(head);
execute(head);
}
打印功能是自定义打印列表功能。我做的很简单,执行是免费的()列表。打印头,打印仅5,10,23和5,10,23。不包括head2的x值。我想追加head2&x; s xp的head1。
答案 0 :(得分:1)
此循环后
while(go1!=NULL) go1=go1->next;
指针go1
等于NULL
,前一个节点的数据成员next
也等于NULL
。如果您更改指针go1
,前一节点的数据成员next
将不会更改,因为它们是不同的对象占用不同的内存范围。
此外,通常第一个列表可以为空,因此最初参数go1
可以等于NULL并且更改此参数不会更改原始列表,因为该函数处理原始列表的值的副本
也是第二次内存分配
go1=(node*)malloc(sizeof(node));
go1->x=go2->x;
go1=(node*)malloc(sizeof(node));
没有意义。它会覆盖go1
的先前值。结果是内存泄漏。
该功能可以按以下方式编写
void combine( struct node **go1, struct node **go2 )
{
while ( *go1 != NULL ) go1 = &( *go1 )->next;
for ( ; *go2 != NULL; go1 = &( *go1 )->next, go2 = &( *go2 )->next )
{
*go1 = ( node* )malloc( sizeof( node ) );
( *go1 )->x = ( *go2 )->x;
( *go1 )->next = NULL;
}
}
该功能可以像
一样调用combine( &head, &head2);
当然,没有必要将第二个参数声明为类型struct node **
。将其声明为struct node *
就足够了。但是在这种情况下,参数将具有不同的类型,可能会使功能的用户感到困惑。