Im folgenden Code sehen Sie eine einfache Integer-Linked-Liste, realisiert mit Zeigern in C. Ich habe zwei verschiedene Funktionen zum Einfügen eines neuen int val an der Spitze der Liste. Ich dachte, dass diese 2 Funktionen gleichwertig wären, aber wie die Ausgabe zeigt, sind sie nicht.C: Verkettete Listen - Funktion "Insert first" funktioniert nicht wie erwartet
#include <stdio.h>
#include <stdlib.h>
typedef struct _IntlistElem* Intlist;
typedef struct _IntlistElem {int val; Intlist next;} IntlistElem;
Intlist insertfirst(int val, Intlist list) {
Intlist new = malloc(sizeof(IntlistElem));
new->val = val;
new->next = list;
return new;
}
Intlist insertfirstAlternative(int val, Intlist list) {
IntlistElem new = {val, list};
Intlist head = &new;
return head;
}
void print(Intlist l){
while (l!=NULL){
printf("%d\n", l->val);
l = l->next;
}
printf("_____\n");
}
int main(){
Intlist ls = NULL;
ls = insertfirst(2, ls);
ls = insertfirst(1, ls);
print(ls);
Intlist lsAlt = NULL;
lsAlt = insertfirstAlternative(2, lsAlt);
lsAlt = insertfirstAlternative(1, lsAlt);
print(lsAlt);
return 0;
}
Ausgang:
1
2
_____
1
1
...
Meine Fragen sind:
1. Warum ist die Druckfunktion nicht beendet? (nach Aufruf der Alternativfunktion)
2. Warum sind diese 2 "insertfirst" -Funktionen nicht wie erwartet?
Was ist der Unterschied zwischen diesen Funktionen?
Ich freue mich auf Ihre Antworten. :)
Sie sollten dringend lernen, wie Sie den Debugger verwenden, um Ihren Codefluss und die aktuellen Variablenwerte beim schrittweisen Zeilenumbruch zu überprüfen. –
'Intlist head = &new;': 'neu' ist lokale automatische Variable. Es ist außerhalb des Gültigkeitsbereichs nicht gültig. – BLUEPIXY
Dieser Code kompiliert nicht mit Warnflags (gcc's sind: -Wall -Werror -Wextra). Ich ermutige Sie, sie das nächste Mal zu verwenden. – qleguennec