2012-03-13 2 views
2

Следующий код C - это мой собственный способ записи примитивного связанного списка. Он использует структуру, называемую lnode. Я знаю, что это не лучший/самый эффективный способ сделать это, но моя идея такова: создайте базовый узел, используйте указатель «итератор», здесь q, который указывает на последний узел в списке, а затем добавьте новый узел ,C Пример LinkedList не компилирует

Следующий код не компилируется. Я не могу найти причину, но он не поддерживает эту строку.

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: Отсутствует операнд structure1.c (17):

Предупреждение! W111: Бессмысленное использование выражения structure1.c (17):

Ошибка! E1009: Ожидание ';' но найдено «struct» structure1.c (17):

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

Ошибка! E1011: Символ «q» не был объявлен. Struct1.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; 

    } 
} 

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

+1

Что такое сообщение об ошибке, что вы получите от компилятора? – Jesper

+1

Он компилируется для меня с GCC –

+0

Не для любви к Иисусу отбрасывает возвращаемое значение malloc()! –

ответ

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

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

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

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

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

+0

Как вы рекомендуете это исправлять? Я пытаюсь немного обосновать это на примере структуры tnode в K & R. –

+1

@JJG Я не знаю, потому что я не знаю, чего вы пытаетесь достичь. Я говорю, что после того, как вы закончите ошибку компилятора, вы столкнетесь с этим. Лучше задайте другой вопрос, когда вы достигнете этого. –

1

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

Далее; Вы переключаете 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; 
}