当前位置: 首页 > 知识库问答 >
问题:

在C语言中合并两个链表时遇到问题

羊新翰
2023-03-14

我应该编写一个函数来合并(将一个放在另一个的末尾)两个单独链接的列表。用户向控制台输入一系列数字,例如:1 2 3 4 0(0表示输入结束,不是列表中的元素)。这些数字被放入链表中,链表现在看起来是这样的:1 2 3 4。这个过程再次重复,直到我们有两个不同的链表。然后,合并函数被称为“void merge(结构节点头1,结构节点头2)”。打印新列表后,程序结束。

我的想法是首先将指针指向第一个列表的末尾,然后做一个while循环,它将遍历另一个列表,并使第一个列表的下一个元素成为第二个列表的当前元素。

typedef struct Element Element;

struct Element
{
    int data;
    Element *next;
};

Element *addNew(int data)
{
    Element *newN = (Element*)malloc(sizeof(Element));

    newN->data = data;
    newN->next = NULL;

    return newN;
}

Element *add_on_beginning(Element *head, Element *newN)
{
    newN->next = head;

    return newN;
}

Element *add_on_end(Element *head, Element *newN)
{
    if(head == NULL)
    {
        return newN;
    }

    Element *temp = head;

    while(temp->next != NULL)
    {
        temp = temp->next;
    }

    temp->next = newN;

    return head;
}

void printElement(Element *element)
{
    printf("%d ", element->data);
}

void printList(Element *head)
{
    Element *temp = head;

    while(temp != NULL)
    {
        printElement(temp);
        temp = temp->next;
    }
}

void merge(Element *head1, Element *head2)
{
    Element *temp1 = head1;
    Element *temp2 = head2;

    while(temp1->next != NULL)
    {
        temp1 = temp1->next;
    }

    while(temp2->next != NULL)
    {
        temp1->next = temp2;
        temp2 = temp2->next;
    }
}

int main()
{
    Element *head1 = NULL;
    Element *head2 = NULL;

    int arr[1000];
    char temp1;
    char temp2;
    int i = 0;
    int j = 0;

    printf("Input the first set of elements: \n");

    while(temp1 != '\n')
    {
        scanf("%d%c", &arr[i], &temp1);

        if(arr[i] == 0)
        {
            break;
        }

        head1 = add_on_end(head1, addNew(arr[i]));

        i++;
    }

    printf("Input the second set of elements: \n");

    while(temp2 != '\n')
    {
        scanf("%d%c", &arr[j], &temp2);

        if(arr[j] == 0)
        {
            break;
        }

        head2 = add_on_end(head2, addNew(arr[j]));

        j++;
    }

    merge(head1, head2);

    printList(head1);

    return 0;
}

因此,出于某种原因,该函数只读取第二个列表的最后两个元素。

输入:

1 2 3 4 0
5 6 7 8 0

输出:

1 2 3 4 7 8

我应该得到的结果是

输入:

1 2 3 4 0
5 6 7 8 0

输出:

1 2 3 4 5 6 7 8

共有2个答案

能修谨
2023-03-14

你的问题之一是:

while(temp2->next != NULL) {
    temp1->next = temp2;
    temp2 = temp2->next;
}

您没有更新temp1的值。

还有,你为什么不在做以下事情的同时,代替这一秒:

temp1->next = temp2;

我的意思是链接列表2是正确链接的,你只需要把第一个列表的结尾和第二个列表的开头链接起来。

冷浩瀚
2023-03-14

此函数

void merge(Element *head1, Element *head2)
{
    Element *temp1 = head1;
    Element *temp2 = head2;

    while(temp1->next != NULL)
    {
        temp1 = temp1->next;
    }

    while(temp2->next != NULL)
    {
        temp1->next = temp2;
        temp2 = temp2->next;
    }
}

是无效的。

首先,它不会更改原始指针head1和head2,因为它们是通过值传递给函数的。因此,该函数处理原始指针的副本。

其次,在函数中没有检查Head1Head2是否等于NULL

该函数可以通过以下方式定义

void merge( Element **head1, Element **head2 )
{
    if ( *head1 == NULL )
    {
        *head1 = *head2;
        *head2 = NULL;
    }
    else if ( *head2 != NULL )
    {
        while ( *head1 != NULL ) head1 = &( *head1 )->next;

        for ( ; *head2 != NULL; head2 = &( *head2 )->next )
        {
            *head1 = *head2;
            head1 = &( *head1 )->next;
        }
    }              
}

注意,在列表中输入数据不需要声明数组。

还有这些while循环

    char temp1;
    char temp2;
    int i = 0;
    int j = 0;

    printf("Input the first set of elements: \n");

    while(temp1 != '\n')
    //..

   while(temp2 != '\n')
   //...

具有未定义的行为,因为temp1temp2都未初始化。

 类似资料:
  • 本文向大家介绍c语言实现两个单链表的交叉合并方式,包括了c语言实现两个单链表的交叉合并方式的使用技巧和注意事项,需要的朋友参考一下 如下所示: 总结:链表的遍历注意不要随意改变头指针的位置,进行合并时需要声明三个结构体指针用于进行合并,注意某一链表结束时需要进行链接,再释放生成的链表. 以上这篇c语言实现两个单链表的交叉合并方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支

  • 21. Merge Two Sorted Lists 问题 Merge two sorted linked lists and return it as a new list. 思路 这个题目很简单也有几个可以考虑的思路,一个是比较直接的方式,重新构造链表,一种是利用递归 思路1 :用新的链表 这里用了一个新的节点了保存结果的链表,这里为了方便链表的扩充,增加一个临时的节点变量(否则每次加入都要遍

  • 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 我的链表合并以及排序的函数(mergeTwoLists)代码是哪里有问题吗,为什么输出的结果这么怪异。。。 效果图片

  • 我正在努力解决这个问题,合并两个排序数组(或在这个特定情况下的向量)。当将向量元素记录到控制台时,我得到了非常奇怪的输出。我的理想输出将是所有按顺序排列的数字。 代码如下: 以下是控制台的说明:

  • 问题内容: 我在两个单独的sqlite3数据库中有两个表。数据类型相同,但架构略有不同。我希望它们成为具有相同架构的单个数据库中的单个表 表格1 表2 在两个表之间不是唯一的。我想使用与相同的架构创建另一个表。我希望表1中的条目从0开始,然后从的条目从在的最后一个条目之后开始。 理想情况下,我想刚刚从添加条目,以和“重新索引”的主键,以便它是在同一个升序说:“日期时间”是。 更新 :现在我两个表都

  • 我将创建一个可以插入并显示到现在的链接: 这是我的初始化函数,只会为第一个