我对链表有疑问。例如,我有以下结构和功能。
struct node {
int value;
struct node *next;
};
struct entrynode {
struct node *first;
struct node *last;
int length;
};
void addnode(struct entrynode *entry) {
struct node *nextnode = (struct node *)malloc(sizeof(struct node));
int temp;
if(entry->first == NULL) {
printf("Please enter an integer.\n");
scanf("%d", &temp);
nextnode->value = temp;
nextnode->next = NULL;
entry->first = nextnode;
entry->last = nextnode;
entry->length++;
} else {
entry->last->next = nextnode;
printf("Please enter an integer.\n");
scanf("%d", nextnode->value);
nextnode->next = NULL;
entry->last = nextnode;
entry->length++;
}
}
在if语句的第一部分中,我将输入存储到临时变量中,然后将其分配给结构中的字段。 else分支,我试图直接分配它不起作用。我将如何直接分配它?
感谢您的时间。
答案 0 :(得分:5)
尝试scanf("%d", &(nextnode->value));
答案 1 :(得分:2)
scanf("%d", nextnode->value);
您需要传递一个指向值成员的指针,以保持scanf()的快乐。修正:
scanf("%d", &nextnode->value);
也许从中学到的一个教训是永远不会将数据输入代码与数据结构修改代码混淆。
顺便说一下:请不要使用不必要的括号。如果你这样做,你将永远不会学习优先规则。
答案 2 :(得分:1)
首先,你有一个错误。
其中一行应该是:
scanf("%d", &(nextnode->value));
很抱歉这样说,但你的代码太可怕了!
使用比entrynode
更好的名称。如果它是一个链表,为什么不直接称之为?
我建议您实现以下签名的方法:
bool addnode(struct entrynode * entry,int value);
返回值可让您知道添加是否成功。
你有很多代码重复。尝试删除它。
在调用printf和scanf之后使用上述方法。
让我感到不光彩的是看到printf和scanf在数据结构插入方法中散落,并且如果那么多的代码的冗余副本就会散落。
答案 3 :(得分:0)
它应该是值的地址:
scanf("%d", &(nextnode->value));
一般来说,作为对代码的评论,请避免重复称为复制粘贴反模式的代码。最多重复使用它。通常,如果您发现自己处于重复代码的状态,请创建一个小函数。
答案 4 :(得分:0)
另外,请检查malloc()
来电的返回值。同样,请不要使用C编程语言转换malloc()
的返回值。