C LinkedList пример не компилируется - PullRequest
2 голосов
/ 13 марта 2012

Следующий код 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: Отсутствует операнд struct1.c (17):

Внимание!W111: Бессмысленное использование выражения структура1.c (17):

Ошибка!E1009: Ожидается ';'но обнаружил структуру: struct1.c (17):

Ошибка!E1011: Символ 'lnode' не был объявлен struct1.c (17):

Ошибка!E1011: Символ 'q' не был объявлен struct1.c (17):

Ошибка!E1014: левый операнд должен иметь структуру lvalue .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, %i\n",p->value,q->value);
        q=p;

    }
}

Я напечатал значения «значения» каждого узла в списке вместе с предыдущим значением.Это работает за исключением первой итерации, которая дает странный вывод.

Ответы [ 3 ]

4 голосов
/ 13 марта 2012

Я подозреваю, что компилятор (например, компиляторы 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 голос
/ 13 марта 2012

Сообщения об ошибках вызваны смешиванием кода и объявлений.

Далее;Вы переключаете p и q в цикле for.

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;
}
1 голос
/ 13 марта 2012

Код компилируется - http://ideone.com/j6fGe - но логика неверна:

 struct lnode *p  = (struct lnode *)malloc(sizeof(struct lnode));
 p= q->nextnode;

Помимо того, что у вас есть утечка памяти, я уверен, что это не то, что вы хотели.

q->nextnode не указывает на действительный узел, только некоторая случайная память.Который вы затем пытаетесь перезаписать с p->value=i;.

...