Programme C pour faire une deuxième copie d'une liste chaînée

J'ai écrit un code C pour copier le contenu d'une Liste chaînée sur une autre liste. Je veux savoir si il existe un moyen plus efficace de le faire.

Ce qui est mieux?

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;
}

OU

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;
}
Vous êtes à la recherche pour l'exécution de l'efficacité, ou d'un plus compact/moyen élégant de faire cela?
Façon plus élégante de le faire, je suppose.
Que vous devriez le faire récursive.
De manière récursive, à faire il serait très élégant, mais vous devez faire attention de peur que vous DÉBORDEMENT de la PILE. Heheehehe, les jeux de mots à écrire eux-mêmes aujourd'hui. Mais plus sérieusement, vous pouvez seulement de manière récursive jusqu'à présent, sauf si vous utilisez une queue récursive de la langue, qui C ne l'est pas.
Les vrais hommes utilisent goto pour la récursivité 😉 Même si, certains compilateur C implémentations (i.e. GCC avec les extensions?) est possible d'optimiser le TCO dans certains cas .. mais il doit être TCO'able pour commencer.

OriginalL'auteur Vivek | 2012-11-29