链表未正确存储,打印所有节点相同

时间:2015-03-11 00:55:27

标签: c

我遇到这个问题的麻烦我找不到这个bug 我将字符串从文件存储到链表。 假设该文件包含5个字符串

  1. 插孔

  2. 史蒂芬

  3. 麦克

  4. SAM


  5. 问题是当我打印5节点的链表时 它打印[sam] [sam] [sam] [sam] [sam]。 它打印所有节点中的最后一个字符串 我很困惑

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    struct Node {
      char * data;
      struct Node *next;
    };
    
    struct Node *head;
    
    void print() {
        while (head != NULL) {
            printf(" [%s] ", head->data);
            head = head->next;
        }
    
        printf("\n");
    }
    
    void insertb(char *data) {
       struct Node *temp;
    
       temp = (struct Node*)malloc(sizeof(struct Node));
       temp->next = NULL;
       temp->data = data;
    
       if (head == NULL) {
           head = temp;
           printf("%s\n", head->data);
       } else {
           temp->next = head;
           head = temp;
           printf("%s %s\n", temp->data, temp->next->data);
       }
    }
    
    int main (int argc, char *argv[]) {
        FILE *file = fopen(argv[1], "r");
    
        head = NULL;
    
        char data[10];
        //int data;
        while (fscanf(file, "%s",&data) != EOF) {
            insertb(data);
            // printf("%s\n", data);
        }
    
        print();
    
        fclose(file);
        return 0;
    }
    

2 个答案:

答案 0 :(得分:1)

您只有一个缓冲区来存储字符串data。每次调用fscanf都会覆盖它的内容。

尝试insertb(strdup(data));

答案 1 :(得分:0)

您正在将头设置为temp,这是每次向列表中添加一些内容时的最后一个。在insertb函数中,else块可能是您要查找的位置。另外,制作全局变量被认为是一个非常糟糕的主意,因此它很可能无意中改变全局变量的内容,这可能会使事情变得棘手。我建议你在C中寻找通过引用的东西。我看到另一个答案告诉你使用strdup,也许我也错了,我不想与之争论,但strdup重复了字符串。而不是我用

“重新初始化”char数组
memset(buffer, 0, bufferLength); 

并在字符串末尾手动添加“\ 0”字符以防止在缓冲区中保存垃圾。希望这会有所帮助。