将文件读入链表

时间:2014-05-21 21:54:20

标签: c file-io linked-list scanf

我正在尝试读取包含以下内容的文件。

59878, Moby Dick
442419, The Peach
535, Moby Dick
12, History of War

我有一个包含整数类型的链表,另一个包含char和链表的指针。这是后一个链表中的一个节点:

typedef struct Node {
   struct Node* prev;
   char *title;
   ListRef library; //Pointer to a different linked list
   struct Node* next;
} Node; 

typedef struct Node* NodeRef;

NodeRef newNode(char *bookTitle, List LL) {
  NodeRef node = (Node*)malloc(sizeof(Node));
  node->next = node->prev = NULL;
  node->title = (char*)calloc(60, sizeof(char));
  node->library = newList();
  node->library = LL;
  node->title = bookTitle;
return(node);

}

2 个答案:

答案 0 :(得分:0)

您应该使用

存储title
node->title = strdup(bookTitle); 

删除calloc行,因为strdup将为您执行内存分配。


当前编写代码时,为字符串分配内存,然后分配行

node->title = bookTitle;

将指针更改为指向bookTitle指向的缓冲区。据推测,您正在重用bookTitle缓冲区,因此在程序结束时,所有标题都指向同一个缓冲区,该缓冲区包含从文件中读取的最后一个标题。

答案 1 :(得分:0)

NodeRef newNode(char *bookTitle, List LL) {
  NodeRef node = (Node*)malloc(sizeof(Node));

仅供参考:上述行不需要转换malloc()返回的值。相反,该行可以是:NodeRef node = malloc(sizeof(Node));

  node->next = node->prev = NULL;
  node->title = (char*)calloc(60, sizeof(char));

现在node-> title指向一个60字节的已分配块。

  node->library = newList();
  node->library = LL;
  node->title = bookTitle;

因此,booktitle是指向包含字符串的内存的指针。上面的语句导致node-> title指向bookTitle指向的同一个东西。对于之前指向的60个字符的已分配块太糟糕了;记忆现在无法恢复孤儿。 (这不是我想要的,我确定)。

上述行应更改为以下内容:

  // Assumption: bookTitle contains a properly terminated C string.
  node->title = strdup(bookTitle); 
  if(NULL == node->title)
     {
     fprintf(stderr, "strdup() failed!\n");
     /* and handle the error, even though you may never actually see it... */
     ...
     }

  return(node);
} 

在创建新节点时,它们都指向同一个项目,该地址包含在' bookTitle'中。因此,当打印出列表时,那就是(危险地)你得到的东西。所有节点都指出了上一本书中添加的书名。