以下C代码是我自己编写基本链表的方式。它使用一个名为lnode的结构。我知道这不是最好/最有效的方法,但我的想法是:创建基节点,使用“迭代器”指针,这里q,指向列表中的最后一个节点,然后添加一个新节点。
以下代码无法编译。我找不到原因,但讨厌这条线
struct lnode *q= malloc(sizeof(struct lnode));
关于使这个想法有效的任何建议?提前谢谢。
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
struct lnode{
int value;
struct lnode *nextnode;
};
int main(){
struct lnode *startnode = malloc(sizeof(struct lnode));
startnode->value=0;
startnode->nextnode=NULL;
struct lnode *q= malloc(sizeof(struct lnode));
int i = 0;
for(i=0;i<10;i++){
struct lnode *p = malloc(sizeof(struct lnode));
p= q->nextnode;
p->value=i;
p->nextnode=NULL;
q=p;
}
return 0;
}
我想指出我是新手。我正在使用Watcom编译器(为什么?我的计算机已经很老了,这就是我需要的所有这些练习图)日志输出是
structure1.c(17):错误! E1063:缺少操作数结构1(17):
警告! W111:无意义地使用表达式structure.c(17):
错误! E1009:期待';'但找到了“struct”structure1.c(17):
错误! E1011:符号'lnode'尚未声明为structure1.c(17):
错误! E1011:符号'q'尚未声明为structure1.c(17):
错误! E1014:左操作数必须是'左值'structure1.c(19):
我按照给出的建议并更改了新代码的代码:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
struct lnode{
int value;
struct lnode *nextnode;
};
int main(){
struct lnode *startnode = (struct lnode *)malloc(sizeof(struct lnode));
struct lnode *q;
startnode->value=0;
startnode->nextnode=NULL;
q = malloc(sizeof(struct lnode));
doLoop(q);
return 0;
}
void doLoop(struct lnode *q){
int i = 0;
for(i=0;i<10;i++){
struct lnode *p = (struct lnode *)malloc(sizeof(struct lnode));
q->nextnode=p;
p->value=i;
p->nextnode=NULL;
printf("%i, %i\n",p->value,q->value);
q=p;
}
}
我打印了列表中每个节点的“值”值以及之前的值。它的工作原理除了第一次迭代外,它给出了一个奇怪的输出。
答案 0 :(得分:4)
我怀疑编译器(例如Microsoft编译器)仅支持C89标准,它不允许代码和声明的混合。将q
的声明移至范围顶部:
int main(){
struct lnode *startnode = (struct lnode *)malloc(sizeof(struct lnode));
struct lnode *q
startnode->value=0;
startnode->nextnode=NULL;
q = malloc(sizeof(struct lnode));
答案 1 :(得分:1)
代码编译 - http://ideone.com/j6fGe - 但逻辑错误:
struct lnode *p = (struct lnode *)malloc(sizeof(struct lnode));
p= q->nextnode;
除了你有内存泄漏的事实,我确信这不是你想要的。
q->nextnode
未指向有效节点,只指向某个随机内存。然后,您尝试使用p->value=i;
覆盖。
答案 2 :(得分:1)
错误消息是由于代码和声明的混合造成的。
此外;你在for循环中切换p和q。
p = q->next_node; /* here you set p to an undefined area.
* q->next_node is not malloc'd */
p->value = i; /* here you cause undefined / erronous behaviour
* Most probably a SIGSEGV */
总而言之,或许类似于:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
struct lnode{
int value;
struct lnode *nextnode;
};
int main(void)
{
struct lnode *startnode;
struct lnode *p;
size_t z;
int i;
z = sizeof(struct lnode);
if ((startnode = malloc(z)) == NULL) {
fprintf(stderr, "Unable to malloc %d bytes.\n", z);
return 1;
}
/* Fill list */
p = startnode;
for (i = 0; i < 10; i++) {
if ((p->nextnode = malloc(z)) == NULL) {
fprintf(stderr, "Unable to malloc %d bytes.\n", z);
return 1;
}
p->value = i;
p = p->nextnode;
p->nextnode = NULL;
}
/* Print values */
p = startnode;
while (p->nextnode != NULL) {
printf("value: %2d\n", p->value);
p = p->nextnode;
}
/* Free */
p = startnode;
while (p != NULL) {
p = p->nextnode;
free(startnode);
startnode = p;
}
return 0;
}