C 合并两个链表

C 合并两个链表,c,linked-list,C,Linked List,我试图将两个链表的内容复制到一个链表中,这样一次复制一个元素(来自每个链表) 因此,如果我有:list1=[1,2,3]和list2=[4,5,6],那么结果=[1,4,2,5,3,6]。 如果一个列表比另一个短,则剩余的节点将追加到结果列表的末尾 下面是我的代码,它有一个小错误:它在末尾创建了一个额外的节点(我不想要) 如何修改它,使其不创建最后一个节点 输入示例: 这会让你走的。注意,在您的示例中,似乎需要对输出进行排序。通过添加一些额外的测试,您可以将其作为列表合并操作的一部分来处理,但我

我试图将两个链表的内容复制到一个链表中,这样一次复制一个元素(来自每个链表)

因此,如果我有:
list1=[1,2,3]
list2=[4,5,6]
,那么
结果=[1,4,2,5,3,6]
。 如果一个列表比另一个短,则剩余的节点将追加到结果列表的末尾

下面是我的代码,它有一个小错误:它在末尾创建了一个额外的节点(我不想要)

如何修改它,使其不创建最后一个节点

输入示例:
这会让你走的。注意,在您的示例中,似乎需要对输出进行排序。通过添加一些额外的测试,您可以将其作为列表合并操作的一部分来处理,但我将把它作为一个练习(不确定排序结果是否是您需求的一部分)


不要在一个while块中进行合并,这会使代码更难阅读。在功能上,将列表副本分解为另一个函数并调用它两次

在循环之前执行newnode,然后在添加当前项之后执行newnode。那么

node *mylist; 
node *head;

while (listItem != null) {

    if(head == null) {        
       mylist = newnode();
       head = myList;
    }
    else {
       mylist->next = newnode();
       mylist = mylist->next;
    }


    mylist->data = listItem->data;    
    listItem = listItem->next;
}

下面是您的代码,稍作修改。希望这对你有帮助

node *list_copy(node *list1, node *list2) 
{
    node *mylist = NULL; 
    node *head = NULL;

    while (list1 != NULL || list2 != NULL) {        

        if (head == NULL)
        {
            mylist = newnode();
            head = mylist;
        }  
        else
        {
            mylist->next = newnode();
            mylist = mylist->next;                 
        } 

        if (list1 != NULL) {
            mylist->data = list1->data;   
            list1 = list1->next;
        } 
        if (list2 != NULL) { 
            mylist->data = list2->data;
            list2 = list2->next;
        }
        mylist->next = NULL;
    }
    return head;
}

更新:OP似乎需要列表的副本

#include <stdlib.h>
struct llist * llist_merge_and_dup(struct llist *one, struct llist *two, int (*cmp)(struct llist *l, struct llist *r) );
struct llist *llist_dup(struct llist *org);

struct llist *llist_dup(struct llist *org)
{
struct llist *new;
new = malloc (sizeof *new);
if (!new) return NULL;
memcpy (new, org, sizeof new);
new->next = NULL;
return new;
}

struct llist * llist_merge_and_dup(struct llist *one, struct llist *two, int (*cmp)(struct llist *l, struct llist *r) )
{
struct llist *result, **tail;

for (result=NULL, tail = &result; one && two; tail = &(*tail)->next ) {
        if (cmp(one,two) <=0) { *tail = llist_dup(one); one=one->next; }
        else { *tail = llist_dup(two); two=two->next; }
        }

for( ; one; one = one->next) {
        *tail = llist_dup(one);
        }

for( ; two; two = two->next) {
        *tail = llist_dup(two);
        }
return result;
                                                                                              }
#包括
struct-llist*llist\u merge\u和_dup(struct-llist*one,struct-llist*two,int(*cmp)(struct-llist*l,struct-llist*r));
struct-llist*llist_-dup(struct-llist*org);
struct-llist*llist\u-dup(struct-llist*org)
{
struct-llist*新;
新=malloc(sizeof*新);
如果(!new)返回空值;
memcpy(新的、组织的、新的大小);
新建->下一步=空;
归还新的;
}
struct-llist*llist\u merge\u和_dup(struct-llist*one,struct-llist*two,int(*cmp)(struct-llist*l,struct-llist*r))
{
结构llist*结果,**尾部;
for(result=NULL,tail=&result;one&&two;tail=&(*tail)->next){
if(cmp(一,二)next;}
else{*tail=llist_dup(两个);两个=两个->下一个;}
}
对于(;一;一=一->下一个){
*tail=llist_dup(一个);
}
对于(;二;二=二->下一步){
*tail=llist_dup(两个);
}
返回结果;
}

如果它是节点,为什么要将其命名为“mylist”?为变量命名是非常重要的habit@xvatar什么?[15个字符]如果list1和list2都不为空,那么您的代码将只添加list2->data中的数据(例如mylist->data=list2->data将覆盖您在前面的If语句中设置的list1->data值)。另外,通过分配mylist->next,然后将其设置为NULL,您将保留一个未折叠的内存引用。是的,这是一个错误,我需要修改我的代码
---------- Capture Output ----------
> "c:\windows\system32\cmd.exe" /c C:\temp\temp.exe
1
2
3
1
2
3
4
5
6

> Terminated with exit code 0.
node *mylist; 
node *head;

while (listItem != null) {

    if(head == null) {        
       mylist = newnode();
       head = myList;
    }
    else {
       mylist->next = newnode();
       mylist = mylist->next;
    }


    mylist->data = listItem->data;    
    listItem = listItem->next;
}
node *list_copy(node *list1, node *list2) 
{
    node *mylist = NULL; 
    node *head = NULL;

    while (list1 != NULL || list2 != NULL) {        

        if (head == NULL)
        {
            mylist = newnode();
            head = mylist;
        }  
        else
        {
            mylist->next = newnode();
            mylist = mylist->next;                 
        } 

        if (list1 != NULL) {
            mylist->data = list1->data;   
            list1 = list1->next;
        } 
        if (list2 != NULL) { 
            mylist->data = list2->data;
            list2 = list2->next;
        }
        mylist->next = NULL;
    }
    return head;
}
#include <stdlib.h>
struct llist * llist_merge_and_dup(struct llist *one, struct llist *two, int (*cmp)(struct llist *l, struct llist *r) );
struct llist *llist_dup(struct llist *org);

struct llist *llist_dup(struct llist *org)
{
struct llist *new;
new = malloc (sizeof *new);
if (!new) return NULL;
memcpy (new, org, sizeof new);
new->next = NULL;
return new;
}

struct llist * llist_merge_and_dup(struct llist *one, struct llist *two, int (*cmp)(struct llist *l, struct llist *r) )
{
struct llist *result, **tail;

for (result=NULL, tail = &result; one && two; tail = &(*tail)->next ) {
        if (cmp(one,two) <=0) { *tail = llist_dup(one); one=one->next; }
        else { *tail = llist_dup(two); two=two->next; }
        }

for( ; one; one = one->next) {
        *tail = llist_dup(one);
        }

for( ; two; two = two->next) {
        *tail = llist_dup(two);
        }
return result;
                                                                                              }