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
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
Vous devez vous connecter pour publier un commentaire.
Pour la copie d'une liste liée à une autre liste liée, vous avez pas d'autre option mais à parcourir et copie les valeurs de la seconde, dans un total de
O(n)
temps.Vous êtes déjà de le faire. Il est aucun moyen de faire mieux, sauf s'il existe une relation entre les éléments qui sont stockés.
Une solution récursive peut-être mieux de regarder, mais il sera en fait moins efficace.
Edit: Pour la question changé
La version Itérative est mieux.
Remarque : LOC n'a pas de rapport direct avec l'efficacité.
Les lignes de code n'a rien à voir avec l'efficacité. Votre question portait sur l'amélioration de l'efficacité et je pense que j'ai répondu 🙂
Merci pour ur réponses
vous pouvez réduire le nombre de lignes. voir ma réponse
Mais il ne sera pas nécessairement le rendre efficace. En Plus (voir mon commentaire.
OriginalL'auteur axiom
Sans aller récursive, c'est le plus compact, vous pouvez obtenir:
OriginalL'auteur wildplasser
Pour vitesse, il peut en effet être une meilleure façon de le faire. Comme toujours, la seule façon de le savoir est à l'indice de référence.
il peut être plus rapide:
passer une itération de comptage de la longueur de la liste d'origine
allouer de l'espace pour tous les nœuds requis dans un seul bloc
et puis passer une seconde itération de lier votre tableau de nœuds
Comme je l'ai dit, je ne suis pas prometteur, il sera être plus rapide (et c'est certainement plus laid), mais il peut être sur certains systèmes, avec certains compilateurs, sous certaines conditions. Bien sûr, c'est un non-starter si le reste de votre code suppose que vous pouvez
free
nœuds individuels.Pour élégance, la récursivité naturellement gagne.
La simple approche itérative est généralement va être un bon compromis, même si, entre élégant, mais peut exploser à moins que vous ayez une belle TCO-ing compilateur et ci-dessus, ce qui est franchement un peu moche et bénéficieraient d'un commentaire explicatif.
OriginalL'auteur Useless