繁体   English   中英

将文件读入链接列表

[英]Reading a file into a linked list

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

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);

}

您应该将title

node->title = strdup(bookTitle); 

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


由于当前正在编写代码,因此您为字符串分配了内存,但随后为该行分配了内存

node->title = bookTitle;

更改指向的指针,使其指向bookTitle指向的缓冲区。 大概是在重用bookTitle缓冲区,因此在程序结束时,所有标题都指向同一个缓冲区,并且该缓冲区包含从文件读取的最后一个标题。

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;

因此,书名是指向包含字符串的内存的指针。 上面的语句使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”中包含的地址。 因此,在打印出列表时,这(危险地)就是您得到的。 所有节点都指向最后添加的书中的书名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM