【问题标题】:C: moving elements from one list to another [closed]C:将元素从一个列表移动到另一个列表[关闭]
【发布时间】:2018-09-03 17:28:30
【问题描述】:

(程序是 C 语言)我在这里有我的自制列表:

  • a1, a2, a3... 和 b1, b2... 是结构体,每个都存储一些数据和一个指针 (next) 指向下一个结构体(图中它们下方的那个),
  • temp、top1、head 和 head 1 只是指向这些结构的指针,它们不存储其他数据,

我想将情况更改为以下内容:

我总是将列表的第一个元素移动到左侧并放入右侧列表的末尾

我现在不确定是否需要 temp,我很可能不需要。 如何实现第二张图片所示的效果?

我显然不能以明显的方式使用 a1、a2、a3、b1 和 b2,因为它们没有名称,它们是由 malloc 动态分配的(是的,我知道这很糟糕,但在我正式知道之前那个,我的老师出于某种原因想让我了解它)。

【问题讨论】:

  • 您是否总是从列表中移动 first 元素,或者这只是一个示例?
  • @BoPersson 我总是从列表中取出第一个元素并将其放在第二个列表的末尾。

标签: c list linked-list


【解决方案1】:

按照以下步骤操作:

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

listA 是左侧的列表,我假设 top1 必须指向 listB 的最后一个节点(右侧的列表)。

【讨论】:

  • 第二行是我说不能做的,我的程序里没有b2这个东西,是用malloc分配的,所以没有名字。
  • @Ania 是的,在 C 中没有动态分配的名称,B2 我的意思是 head1->next->next-next。 head1->next 是 B1,head1->next->next 是 B2。
  • 但我不想只做一次,我想总是从左侧列表中取出第一个元素并将其放在右侧列表的末尾。该列表将有超过 13000 条记录,我不能总是写 head1->next->next->next->next->(...)。这就是我做 top1 的原因。
  • @Ania 编辑了我的答案,以便根据需要容纳尽可能多的节点。
  • 谢谢,我需要一些时间来分析它,因为我对非图书馆的列表很新鲜。
【解决方案2】:
  1. 存储您要移动的节点(在 temp 中)。

temp = list_a->head;

  1. 将第一个列表的头移到第二个节点。

list_a->head = list_a->head->next;

  1. 将 tmp 添加到最后一个节点的第二个列表中。 (最后一个节点存放在top1中)

top1->next = temp;

  1. 移动的节点指向第一个链表的新头,所以删除指针。

temp->next = NULL;

  1. 不需要,但图片上说 temp 需要保存指向 list_a 新头的指针。

temp = list_a->head;

  1. 移动 top1 以指向移动的节点。

top1 = top1->next;

如果我的答案不够清楚,请尝试分步绘制。

【讨论】:

    【解决方案3】:

    首先,您根本不需要temp 指针。指针head 足以管理链接列表。但是为了在列表末尾快速插入,您始终可以维护一个指向最后一个节点的 last 指针。

    在您的结构中temp 指针没有发挥任何作用。您可以随时创建一个temp 指针来操作列表并分配列表的第二个节点的地址,如下所示:-

       temp = head->next;
    

    如果两个列表中的结构属于同一类型,您可以轻松地将每个元素移动到下一个列表。否则,在第二个结构中,您必须再引入一个 next 指针,它可以存储第一个列表元素的地址。

    要首先移动元素,您需要到达最后一个元素(根据您的要求),您可以如下实现:-

     temp = head1;
     while(temp->next != NULL)
       temp = temp->next;
    //now while loop will break once temp point at the last node i.e. b2 in your case
      //Now if you want to move all the element of the first list just do like below
    
     temp->next = head;
    
     //if you want to move only the first element a1 you can do it like below
     temp->next = head;
     // now you have to move the head node like below in the first list
     head = head->next;
    

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多