[英]C printing a linked list not working?
我正在從文件中讀取內容,並嘗試將其添加到鏈接列表中,然后遍歷鏈接列表以將內容打印出來。 我有點麻煩,因為我的輸出不是打印整個鏈接列表,而是多次打印最后一個元素。 我在下面發布了代碼,並且僅發布了代碼片段,並刪除了簡短的錯誤檢查。
typedef struct Node{
char* data;
struct Node* next;
} NODE;
NODE* head = NULL;
NODE* tail = NULL;
int main(int argc, char* argv[])
{
char buffer[1024];
FILE* fp = fopen(argv[1], "r");
while(fscanf(fp, "%1023s", buffer) == 1)
{
addNode(buffer);
}
print_linked_list(head);
return 0;
}
void print_linked_list(NODE* head)
{
NODE* ptr = head;
while(ptr != NULL)
{
printf("%s ", ptr -> data);
ptr = ptr -> next;
}
}
void addNode(char* str)
{
NODE* newNode = createNode(str);
if(head == tail && tail == NULL)
{
head = newNode;
tail = newNode;
head -> next = NULL;
tail -> next = NULL;
}
else
{
tail -> next = newNode;
tail = newNode;
tail -> next = NULL;
}
}
NODE* createNode(char* str)
{
NODE* newNode = malloc(sizeof(NODE));
newNode -> data = malloc((1 + strlen(str)) * sizeof(char));
newNode -> data = str;
newNode -> next = NULL;
return newNode;
}
因此,如果文件中包含諸如“你好嗎”之類的文本,我希望輸出的內容將顯示為“你好嗎”,但我得到的只是“你好你”。 我該如何解決?
在
newNode -> data = malloc((1 + strlen(str)) * sizeof(char));
newNode -> data = str;
您是否要從str
到newNode->data
進行字符串復制( strncpy()
)?
使用newNode->data = str;
指針被復制,內容(例如“你好嗎”) 不被復制。
一個簡單的方法可能是
newNode->data = strdup(str);
從http://man7.org/linux/man-pages/man3/strdupa.3.html
The strdup() function returns a pointer to a new string which is a duplicate of the string s. Memory for the new string is obtained with malloc(3), and can be freed with free(3).
newNode->data = str;
是問題。 你malloc
ING空間的字符串,分配該地址newNode->data
,然后立即地址到覆蓋malloc
ED空間的地址str
,這實際上是地址buffer
一路之main
。 這不僅會造成內存泄漏,還可以說明您的行為。 每次創建節點的時候,你要指定newNode->data
給的地址buffer
,所以當“你”被存儲在最后一個字buffer
,這是字符串的所有節點打印。 您真正想要做的是從str
到新malloc
空間中的字符串strcpy
(或等效的東西)。 您還應該首先檢查malloc
的返回值,以確保它返回了有效的指針:
#include <string.h>
....
if (newNode->data != NULL)
{
strcpy(newNode->data, str);
}
else
{
// handle error
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.