簡體   English   中英

C打印鏈表不起作用?

[英]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;

您是否要從strnewNode->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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM