下面的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.c(17):
警告!W111:表达结构的无意义使用1.c(17):
错误!E1009:应为";"但找到了"struct"structure1.c(17):
错误!E1011:符号"lnode"尚未声明structure1.c(17):
错误!E1011:符号"q"尚未声明为structure1.c(17):
错误!E1014:左操作数必须是"左值"结构1.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, %in",p->value,q->value);
q=p;
}
}
我打印了";值";列表中每个节点的值以及上一个值。除了第一次迭代会产生奇怪的输出外,它还能工作。
我怀疑编译器(例如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));
代码编译-http://ideone.com/j6fGe-但逻辑是错误的:
struct lnode *p = (struct lnode *)malloc(sizeof(struct lnode));
p= q->nextnode;
除了你的内存泄漏之外,我相信这不是你想要的。
q->nextnode
不指向有效节点,只指向一些随机内存。然后尝试用p->value=i;
覆盖。
错误消息是由于代码和声明的混合造成的。
此外;在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: %2dn", p->value);
p = p->nextnode;
}
/* Free */
p = startnode;
while (p != NULL) {
p = p->nextnode;
free(startnode);
startnode = p;
}
return 0;
}