Ich habe eine doppelt verknüpfte Liste, die ich von oben nach unten drucken kann, und jetzt versuche ich, sie von unten nach oben zu drucken.eine doppelt verkettete Liste in umgekehrter Reihenfolge drucken
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
//defines the struct UserData
typedef struct
{
int importance;
char taskName[80];
}UserData, *UserDataPtr;
//Defines a node
typedef struct node {
UserData Data;
struct node *next;
struct node *prev;
} Node, *NodePtr;
NodePtr makeNode(UserData);
//Declare function printList
void printList(NodePtr);
void printListRev(NodePtr);
int main()
{
UserData info;
NodePtr top, ptr, last, temp;
top = NULL;
FILE *filein=fopen("Data.txt", "r");
if (filein == NULL) {
printf("Error opening file, exiting program.\n");
exit(0);
}
while(fscanf(filein, "%d%s",&info.importance, info.taskName)==2)
{
ptr=makeNode(info);
if (top == NULL) top = ptr;
else last -> next = ptr;
last = ptr;
}//end while loop
printList(top);
printListRev(last);
}//end Main
//printList is a function that prints each node as long as it isn't NULL. Once it reaches NULL it terminates, signifying the end of the list.
void printList(NodePtr ptr) {
while (ptr != NULL) { //as long as there's a node
printf("%d %s\n", ptr -> Data.importance, ptr -> Data.taskName);
ptr = ptr -> next; //go on to the next node
}
if (ptr == NULL) {
printf("Last node data printed moving forward.\n");
}
} //end printList
void printListRev(NodePtr ptr) {
while(ptr != NULL){
printf("%d %s\n", ptr -> Data.importance, ptr -> Data.taskName);
ptr = ptr -> prev;
}
}//end printListRev
//Define function makeNode. Allocates storage for node, stores integer given to it, and returns a pointer to the new node. Also sets next field to NULL
NodePtr makeNode(UserData info) {
NodePtr ptr = (NodePtr) malloc(sizeof (Node));
ptr -> Data = info;
ptr -> next = NULL;
ptr -> prev = NULL;
return ptr;
} //End makeNode
Dies ist die Ausgabe:
1 task1
2 task2A
3 task3A
2 task2B
4 task4A
4 task4B
3 task3B
Last node data printed moving forward.
3 task3B
Und ich habe keine Ahnung, warum es nicht die vollständige Liste in umgekehrter Reihenfolge gedruckt werden. Es druckt nur einen Artikel, wenn rückwärts gedruckt wird.
Alles bis zur Meldung "Letzte Node Daten gedruckt" ist korrekt. Und ja, es ist ein bisschen chaotisch, ich bin neu in C und ich muss meine Kommentare und so aufräumen. Entschuldigung.
Kann jemand helfen?
Hinweis sein sollte, dass der Punkt '.' Pfeil und' -> 'Betreiber binden sehr eng und sollte nie mit Leerzeichen um sie geschrieben werden. (Ja, es ist syntaktisch gültig; Sie könnten sie in eine separate Zeile von der Struktur/Zeiger und Member-Namen setzen und es würde kompilieren. Es ist eine Frage der normalen oder konventionellen Präsentation - wie C und C++ geschrieben werden.) –
Während In der Lesephase legen Sie 'last-> next 'fest, aber Sie setzen niemals' prev' member auf etwas anderes als NULL. Sie sollten die Adressen (die 'next'- und' prev'-Mitglieder) mit dem '% p'-Format drucken, während Sie die Liste vorwärts drucken; Sie werden viel zu viele Nullzeiger in den "nächsten" Werten sehen. –