J'ai deux listes liées représentant les chiffres des nombres décimaux dans l'ordre de la plupart au moins significatif. Pour par exemple Je pense à résoudre le problème à l'aide de Stack.I Traversera les listes et appuyer sur les éléments de données en deux piles distinctes.One pour chaque liste liée.Elivez-vous, je vous transmettez les deux piles et ajoutez les éléments ainsi que le résultat est un chiffre à deux chiffres I 10 et stockez le transport Dans une variable TEMP.Le reste est stocké dans le nœud et que le transport est ajouté à la somme suivante et ainsi de suite.
Si les deux piles sont S1 et S2 et la liste liée aux résultats est res. P> 4-> 7-> 9-> 6 code> et
5-> 7 code>
La réponse doit être
4-> 8-> 5-> 3 code> sans inverser les listes car l'inversion des listes entraînerait une diminution de l'efficacité.
temp = 0;
res = (node*)(malloc(sizeof(node*));
while(s1->top!=-1 || s2->top!=-1)
{
temp = 0;
sum = pop(s1) + pop(s2);
n1 = (node*)(malloc(sizeof(node*));
temp = sum/10;
sum = sum%10;
sum = sum+temp;
n1->data = sum;
n1->next = res;
res = n1;
free n1;
//temp=0;
}
if((s1->top==-1)&&(s2->top==-1))
{
return res;
}
else if(s1->top==-1)
{
while(s2->top!=-1)
{
temp = 0;
sum = pop(s2);
sum = sum + temp;
temp = sum/10;
sum = sum%10;
n1 = (node*)(malloc(sizeof(node*));
n1->data = sum;
n1->next = res;
res = n1;
free n1;
}
}
else
{
while(s2->top!=-1)
{
temp = 0;
sum = pop(s2);
sum = sum+temp;
temp = sum/10;
sum = sum%10;
n1=(node*)(malloc(sizeof(node*));
n1->data = sum;
n1->next = res;
res = n1;
free n1;
}
}
return res;
5 Réponses :
Je ne trouverais que la valeur totale de chaque liste liée séparément, ajoutez-les ensemble, puis transformez ce numéro dans une nouvelle liste liée. Donc convertir 4-> 7-> 9-> 6 et 5-> 7 aux nombres entiers avec les valeurs 4796 et 57, respectivement. Ajoutez-les ensemble pour obtenir 4853, puis transformez cela en une liste liée contenant 4-> 8-> 5-> 3. Vous pouvez faire les transformations avec des mathématiques simples. P>
Le faire, votre chemin serait beaucoup plus facile si vous avez changé la manière dont les chiffres sont représentés en premier lieu. Faites donc que ce chiffre est toujours d'abord, suivi du chiffre de dizaines, suivi de centaines, etc. p>
Edit: Puisque vous utilisez apparemment des nombres énormes: avez-vous envisagé de les faire des listes doublement liées? Ensuite, vous n'avez pas besoin de l'inverser, en soi. Juste la traverser à l'envers. P>
Mais que se passerait-il si les deux chiffres sont très nombreux? Où allez-vous les stocker?
Cela ne fonctionne pas. Si les numéros de OP sont des listes liées, l'objectif est sûrement destiné à la manipulation des numéros trop volumineux pour s'adapter à un type numérique de taille fixe.
"Grand" sens au-delà de la capacité d'un long code>?
Mais je n'ai pas l'intention de le faire de cette façon! Mes numéros sont représentés dans la direction inversée !!
@Dylan oui gros signifie plus grand que Evn Long int
@Poulami, avez-vous envisagé de les faire des listes doublement liées? Ensuite, vous pourriez les traverser en arrière tout en les gardant en ordre.
L'utilisation d'une pile n'est pas plus efficace que de renverser les listes (en réalité, il est em> inversant les listes). Si votre objet de pile est alloué de manière dynamique, cela n'est pas grave, mais si vous le créez avec une récursion d'appel, vous obtiendrez facilement un débordement de pile fort> du mauvais type. : -) p>
Si vous liez doublement les listes, vous pouvez ajouter les chiffres et utiliser les liens vers l'envers pour savoir où placer votre valeur d'accès. http://fr.wikipedia.org/wiki/doubly_linked_list P>
+1 C'est la meilleure solution. Encore mieux, vous pouvez utiliser le pointeur "prev" du premier chiffre pour pointer vers la dernière (faites-la circulaire) afin que vous puissiez trouver la fin dans O (1) code> heure.
Deux passes, pas de pile: p>
Obtenez la longueur des deux listes. P> li>
Créer une liste de solutions avec un nœud. Initialiser la valeur de ce nœud à zéro. Cela tiendra le chiffre de transport. Définissez un pointeur de liste (appelez-le le pointeur de repère) à l'emplacement de ce nœud. Définir un pointeur de liste (appelez-le le pointeur de fin) à l'emplacement de ce nœud. P> li>
À partir de la liste plus longue, pour chaque nœud en excès, liez un nouveau nœud au pointeur de fin et attribuez-lui la valeur du nœud en excès. Définissez le pointeur de fin sur ce nouveau nœud. Si la La valeur est inférieure à 9, définissez le pointeur de repère sur le nouveau nœud. P> li>
Nous sommes maintenant laissés avec les deux pointeurs de liste ayant le même nombre de nœuds dans chacun. p> li>
Alors que les listes ne sont pas vides ... p>
liez un nouveau nœud au pointeur de fin et avancez le pointeur de fin sur ce nœud. p> li>
Obtenez les valeurs de chaque liste et avancez chaque point de la liste sur le nœud suivant. P> LI>
Ajoutez les deux valeurs ensemble. p>
Si la valeur est supérieure à neuf, définissez la valeur sur Si la valeur est neuf. Réglez. Ne rien faire d'autre. P> li>
Si la valeur est inférieure à neuf. Réglez. Définissez le pointeur de transport sur le nœud actuel. P> li>
ol> li>
ul> li>
Lorsque vous avez terminé avec les deux listes, vérifiez si la valeur du nœud du pointeur de la solution est nulle. Si c'est le cas, définissez le pointeur de la solution sur le nœud suivant, supprimant le chiffre supplémentaire inutile. P> li>
ul> Valeur MOD 10 CODE>, incrémentez la valeur enfoncée dans le nœud du pointeur de repère, déplacez le pointeur de repère sur le nœud suivant. Si la valeur du pointeur de transport est neuf, réglée sur zéro et accédez au nœud suivant. P> li>
C'est comme ça que j'allais résoudre ce problème:
Étape 1: Strong> Créez une passe sur les deux listes liées, trouvez des longueurs p> dire LEN (L1 ) = m et len (l2) = n code> p>
if ( d > 0 )
-Travel larger list till d positions recursively
-Append sum = value_at_end + carry (update carry if sum >= 10) to output list at beginning
-Repeat until difference is consumed
Votre titre de question est trompeur. Je vois que vous avez une méthode mais quelle est la question actuelle? Comment
(4-> 7-> 9-> 6) + (5-> 7) code> résultat dans
4-> 8-> 5-> 3 code> ??
"Je vais parcourir les listes et appuyer sur les éléments de données en deux piles distinctes.One pour chaque liste liée" - Je pensais avoir dit que vous ne vouliez pas inverser les listes? C'est essentiellement ce que vous faites ici. Je ne dis pas qu'il y a quelque chose de mal à inverser les listes, je souligne juste que vous semblez le faire malgré de dire que vous ne voulez pas.
@Dylan: Ce n'est pas évident pour la première fois (il m'a fallu des chiffres pour comprendre), mais les listes représentent des chiffres d'un numéro, donc
4796 + 57 == 4853 code>.
Je ne sais pas comment "ajouter" les listes pourrait générer
4-> 8-> 5-> 3 code> ...
@Michael Burr: aha merci pour ça
@Michael Burr Je ne renverse pas les listes Je pousse simplement les chiffres dans une pile !!
Les listes sont-elles liées seublement liées (pointes vers l'avant) ou doublement liées (a un pointeur arrière aussi)?
J'ai modifié votre question pour préciser que ces listes représentent des nombres décimaux.
@Poulami: Mon point était que c'est essentiellement la même opération que l'inverser la liste, de sorte que vous n'êtes donc pas «plus efficace». En fait, on pourrait affirmer que poussant sur une pile est moins efficace car vous effectuez une copie des listes. Malgré tout, sauf si vous êtes inquiet de l'ajout de listes avec des centaines de milliers de chiffres, je ne pense pas que l'une ou l'autre méthode pose une grande partie d'un problème d'efficacité. Et si vous êtes inquiet à ce sujet, je commencerais à m'attaquer à cela en utilisant une autre structure de données pour le problème. En d'autres termes, je ne pense pas qu'il y ait une raison particulière d'éviter d'inverser les listes.