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