我有一個雙向鏈接列表,我可以從上到下打印,現在我試圖從下向上打印它。反向打印雙向鏈表
#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
這是輸出:
1 task1
2 task2A
3 task3A
2 task2B
4 task4A
4 task4B
3 task3B
Last node data printed moving forward.
3 task3B
而且我不知道爲什麼它不會打印反向的完整列表。反向打印時僅打印一個項目。
直到「最後一個節點數據打印」消息爲止都是正確的。是的,這有點麻煩,我是C新手,我需要清理我的評論等。道歉。
任何人都可以幫忙嗎?
注意點'.'和箭頭' - >'運營商結合非常緊密,決不能與周圍的空間被寫入。 (是的,它在語法上是有效的;你可以把它們放在與結構體/指針和成員名不同的行上,並且它可以被編譯,這是一個普通或常規表達的問題 - C和C++的編寫方式。) –
期間讀階段,你設置'last-> next',但是你從不將任何'prev'成員設置爲NULL以外的任何其他成員。在向前打印列表時,您應該使用'%p'格式打印地址('next'和'prev'成員);你會在'next'值中看到太多的空指針。 –