C 链接列表示例无法编译



下面的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;
}

相关内容

  • 没有找到相关文章

最新更新