[英]adding structs into doubly linked list in c
我是编程新手(第一学期),我在这里找到的示例在做作业时总是对我有很大帮助! 现在我必须做一个稍微大一点的项目,我已经阅读了很多,但我无法解决问题。
strtok()
将其排序为结构体(通过将从文件读取的数据分配给结构体字段,将其放入结构体中)pNode=head;
一起在 main 中定义)我试图只复制我认为对问题重要的部分。 由于我已经尝试了很多,我什至不知道在哪里寻找错误,任何帮助或提示表示赞赏。 提前谢谢了!
void read_file(struct node *pNode, FILE *fp) {
struct node *head = pNode;
head->next=NULL;
head->prev=NULL;
/*(fread, strtok_r, strtok,...)*/
while (token1 != NULL) {
//allocating memory for the structs
struct node*new = calloc(1, sizeof(struct node));
*new =*pNode;
while (token2 != NULL) {
new->index = (*token2 - 48);
token2 = strtok(NULL, "\n"); //jump to next token (=next line)
new->name = malloc(sizeof(char)*strlen(new->name)+1);
strcpy(new->name, token2);
token2 = strtok(NULL, "\n");
/*(some more sorting into struct)*/
/*ADD STRUCT TO LIST*/
if (head->next==NULL){
head->next=new;
head->prev=NULL;
new->prev=head;
new->next=NULL;
}
new->next = head->next;
head->next = new;
new->next->prev = new;
new->prev = head;
head->prev = NULL;
pNode=new;
}
token_recipe = strtok_r(NULL, "#", &temp); //jump to next token (=next recipe)
}
printf("\nLinked list in backwards order:\n");
while (pNode != NULL) {
printf("%s ", pNode->name);
pNode= pNode->prev;
}
puts("\n");
}
你有一个混乱的纠缠在这里,我会试着帮助解开。
if (head->next==NULL){
head->next=new;
head->prev=NULL;
new->prev=head;
new->next=NULL;
}
new->next = head->next;
head->next = new;
new->next->prev = new;
new->prev = head;
head->prev = NULL;
第一次在你身边有head
new
。 head->next
为NULL
因此您在if
块中执行该位并最终得到如下所示的列表:
头 <-> 新
然后你指向new->next
to head->next
...这意味着你指向new->next
to new
。
头 <-> 新 -> 新
new->next->prev = new
所以new->prev
现在也等于new
头 -> 新 <-> 新
但是随后您修复它以将其指向head
并将head->prev
设置为NULL
,它可能已经是NULL
,因为您永远不会更改它。
头 <-> 新 -> 新
而且你仍然有new
指向自己作为下一个节点的循环循环。
完全废弃该代码。 pNode
是列表中的前一个节点,最初与head
相同 - 这是您应该链接到的变量。
new->prev = pNode;
pNode->next = new;
未指定的上一个和下一个值应该已经设置为NULL
(因为您正在使用calloc
)或指向内存中的有效位置,因此您不需要弄乱它们。
然后在循环结束时正确执行以下操作
pNode = new;
将列表的末尾指向创建的最新节点。
您还应该删除以下行,因为new
是一个全新的节点 - pNode
不应有任何要复制的内容,因此您正在设置您不想要的下一个和上一个值'已经正确设置为NULL
。
*new =*pNode;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.