C程序制作链表的第二个副本

时间:2012-11-29 19:27:03

标签: c algorithm linked-list

我正在编写一个C代码,用于将链接列表的内容复制到另一个列表中。我想知道是否有更有效的方法来做到这一点。

哪个更好?

struct node *copy(struct node *start1)
{
struct node *start2=NULL,*previous=NULL;

while(start1!=NULL)
{
    struct node * temp = (struct node *) malloc (sizeof(struct node));
    temp->info=start1->info;
    temp->link=NULL;

    if(start2==NULL)
    {
        start2=temp;
        previous=temp;
    }
    else
    {
        previous->link=temp;
        previous=temp;          
    }
    start1=start1->link;
}
return start2;
}

OR

struct node *copy(struct node *start1)
{
    if(start1==NULL) return;
    struct node *temp=(struct node *) malloc(sizeof(struct node));
    temp->info=start1->info;
    temp->link=copy(start1->link);
    return temp;
}

3 个答案:

答案 0 :(得分:5)

要将一个链接列表复制到另一个链接列表,您有没有其他选项,但要迭代一个链接并继续将值复制到第二个,总共O(n)次。 你已经这样做了。除非存储的元素之间存在某种关系,否则无法做得更好。

递归解决方案可能更适合查看,但实际上效率较低

编辑:对于已更改的问题

迭代版本为better

注意:LOC与效率没有直接关系。

答案 1 :(得分:1)

没有递归,这是你能得到的最紧凑的:

struct node *copy(struct node *org)
{
struct node *new=NULL,**tail = &new;

for( ;org; org = org->link) {
    *tail = malloc (sizeof **tail );
    (*tail)->info = org->info;
    (*tail)->link = NULL;
    tail = &(*tail)->link;
    }
return new;
}

答案 2 :(得分:1)

对于 speed ,事实上可能有更好的方法。与往常一样,唯一真正的方法是对其进行基准测试。

  • 取决于迭代的相对成本
    • (这可能取决于您分配节点的方式和顺序,以及缓存和内存架构)
  • 免费商店分配
    • (这可能取决于您的堆所处的状态,可能有多少其他线程访问它,主机操作系统中的物理内存状态等)。
  • 可能更快:

    • 花一次迭代来计算源列表的长度

      int len = 0;
      for (start2 = start1; start2 != NULL; start2 = start2->link)
          ++len;
      
    • 为单个块中的所有必需节点分配空间

      struct node *temp = malloc(len * sizeof(*temp));
      
    • 然后花费第二次迭代来连接节点数组

      int i = 0;
      for (start2 = start1; start2 != NULL; start2 = start2->link) {
          temp[i].info = start2->info;
          temp[i].link = &temp[i+1];
      }
      temp[len-1].link = NULL;
      

正如我所说,我不承诺更快(而且肯定更丑),但可能在某些系统上,有些编译器,一些条件。当然,如果您的其余代码假定您可以随意free个别节点,那么它就是非首发。


对于 Elegant ,递归自然会赢。

简单的迭代方法通常是一个很好的折衷方案,但是,优雅之间但可能会爆炸,除非你有一个花哨的TCO编译器以及上面的内容,坦率地说有点丑陋将受益于解释性评论。