我试图通过实现不同的数据结构来使用C。我遇到了一个问题,当我试图在每个while循环迭代中从命令行输入初始化链表时,头部总是被设置为尾部,这是输入到stdin的最后一个命令
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char value[512];
struct node *next;
};
int main(int argc, char *argv[])
{
struct node *head = malloc(sizeof(struct node));
struct node **curr = &head;
int flag = 1;
int c = 0;
while(flag == 1)
{
char cmd[512];
struct node *new_node = malloc(sizeof(struct node));
fgets(cmd, 512, stdin);
cmd[strcspn(cmd, "\n")] = 0;
if (strcmp(cmd,"exit") ==0){
printf("Exiting\n");
break;
} else {
strncpy(new_node->value, cmd, 512);
new_node->value[512 - 1] = '\0';
(*curr)->next = new_node;
*curr = new_node;
}
}
printf("head value: %s\n", head->value);
printf("curr value: %s", (*curr)->value);
return 0;
}
我不明白为什么head-〉value和curr-〉value最后是一样的。任何输入和任何约定修正都是值得欣赏的。我不确定我是否按照预期的方式编写了C。
谢谢你,
我尝试使用不同的指针组合,并且我还尝试复制命令行条目而不是硬设置它。
1条答案
按热度按时间ijxebb2r1#
不清楚是要将新节点插入到列表的开头还是列表的结尾。
如果要在列表的开头插入新节点,则必须在每次插入列表后更新
head
,并将新节点的next
成员设置为旧的head
。如果您想在列表末尾插入新节点,则必须使
curr
始终指向列表最后一个节点的next
成员,或者在列表为空时使其指向head
。您似乎没有应用上述两个选项中的任何一个。相反,您使
curr
始终指向head
,并使head
始终指向最近创建的节点。您还使上一个头节点的next
指针指向新的头节点。换句话说,您正在使next
指针指向错误的方向。next
指针应该始终指向远离头部的方向,而不是指向头部。下面是一个在链表的开头插入节点的示例程序:
此程序具有以下行为:
下面是一个在链表末尾插入节点的示例程序:
此程序具有以下行为: