C链接列表示例无法编译

时间:2012-03-13 15:51:38

标签: c struct linked-list

以下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;

    }
}

我打印了列表中每个节点的“值”值以及之前的值。它的工作原理除了第一次迭代外,它给出了一个奇怪的输出。

3 个答案:

答案 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;
}