此代码有什么问题?值不加入t吗?

时间:2019-01-22 04:14:43

标签: c linked-list singly-linked-list

我必须合并两个排序的链表。 我不知道怎么办,但是t没有增加。代码中有错误吗?

Node * p=(Node*)malloc(sizeof(Node)),*t=p;
while(head1!=NULL && head2!=NULL){
    Node * temp=(Node*)malloc(sizeof(Node));

    if(head1->data<=head2->data){
        temp->data=head1->data;
        temp->next=NULL;
        t=temp;

        head1=head1->next;
        t=t->next;
     }
    else{
        temp->data=head2->data;
        temp->next=NULL;
        t=temp;
        t=t->next;
        head2=head2->next;
    }
}
if(head1==NULL){
    t->next=head2;
    printf("%d\n",t->data);
}
else
t->next=head1;


return p;

}

3 1个 2 3 是第一个链接列表。

3 4 是第二个链接列表

输出必须是: 1 2 3 3 4

我遇到细分错误

1 个答案:

答案 0 :(得分:0)

如果要合并2个列表,则有几个选项。

  1. 您可以将所有元素复制到新列表中。
  2. 您可以从现有列表中删除节点,然后将其放入新列表中。

您所做的不是全部。

从选项1开始:

while(head1!=NULL && head2!=NULL){
    Node * temp=(Node*)malloc(sizeof(Node));

    if(head1->data<=head2->data){
        temp->data=head1->data;
        temp->next=NULL;
        t=temp;

        head1=head1->next;
        t=t->next;
     }
    else{
        temp->data=head2->data;
        temp->next=NULL;
        t=temp;
        t=t->next;
        head2=head2->next;
    }
}

提示:
您可以通过从if else块中提取相同的指令,并仅在else块之后编写一次指令来改进代码:

while (head1 != NULL && head2 != NULL) {
    Node * temp = malloc(sizeof(Node));
    temp->next = NULL;

    if (head1->data <= head2->data) {
        temp->data = head1->data;   
        head1 = head1->next;
    }
    else {
        temp->data = head2->data;
        head2 = head2->next;
    }

    // Now link the new node:
    t->next = temp;  // <<==== Linking fixed.
    t = t->next;
}

还请注意,您与新节点的链接已断开。您丢失了从t到下一个节点的链接。

但是还有另一个问题:

到达列表之一的末尾后,您将停止复制。 您只需将剩余列表一次添加到新列表中即可:

if(head1==NULL){
    t->next=head2;
    printf("%d\n",t->data);
}
else
    t->next=head1;

这意味着您没有副本,但是其余的每个节点都可以通过2个列表获取。

对于旧列表,这意味着第一个节点通过该列表排他地链接,而其他节点有2个引用。

一旦开始处理列表之一,这些节点就可以在一个列表中删除。然后,还有另一个列表中指向这些节点中第一个的链接。 当您通过其余列表访问节点时,这将导致非法的内存访问和未定义的行为。最终可能导致细分失败。

您应该复制所有指针。不停止在任务中间。