2015-01-26 3 views
2

list.hC: разыменования указателя на неполный тип односвязный список

#ifndef LIST_H 
#define LIST_H 

/* Function prototypes */ 
struct nodeStruct* List_createNode(int item); 
#endif 

list.c

#include <stdio.h> 
#include <stdlib.h> 

struct nodeStruct { 
    int item; 
    struct nodeStruct *next; 
}; 
struct nodeStruct* List_createNode(int item) { 
    struct nodeStruct *node = malloc(sizeof(struct nodeStruct)); 
    if (node == NULL) {return NULL;} 
    node->item = item; 
    node->next = NULL; 
    return node; 
} 

main.c:

#include "list.h" 
#include <assert.h> 
#include <sys/types.h> 
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

struct nodeStruct *one = List_createNode(1); 
while(one != NULL) { 
    printf("%d", one->item); //error 
    one= one->next; //error 
} 

Ошибка: error: dereferencing pointer to incomplete type printf("%d", one->item); Ошибка one->item, я попытался использовать несколько комбинаций для разыменования, но, похоже, не работает. Каков правильный подход?

Обновлено:

list.h

#ifndef LIST_H 
#define LIST_H 

    struct nodeStruct { 
    int item; 
    struct nodeStruct *next; 
}; 
/* Function prototypes */ 
struct nodeStruct* List_createNode(int item); 
#endif 

Теперь ошибка, invalid application of ‘sizeof’ to incomplete type ‘struct nodeStruct’ struct nodeStruct *node = malloc(sizeof(struct nodeStruct)); Из моего файла list.c.

+0

Вы включили определение 'struct nodeStruct' в основной файл .c? Кроме того, вы, вероятно, захотите удалить * в 'one = * one-> next;'. О, и изменение «одного» может привести к утечке памяти. – EOF

+0

@EOF это не проблема, потому что другие методы работают. – Aaron

+1

Таким образом, определение 'struct nodeStruct' фактически не доступно для main() **. Поместите определение * struct nodeStruct в 'list.h'. Подсказка: теперь он находится в 'list.c'. – EOF

ответ

2

я могу думать несколько способов:

  1. Поместите определение struct в файл заголовка и #include заголовок файла в main.c.

  2. Добавить пару функций

    int getNodeItem(struct nodeStruct* node) 
    { 
        return node->item; 
    } 
    
    struct nodeStruct* getNextNode(struct nodeStruct* node) 
    { 
        return node->next; 
    } 
    

    и вызывать функции из main.

    while (one != NULL) { 
        printf("%d", getNodeItem(one)); 
        one = getNextNode(one); 
    } 
    
+0

# 1 не работает. Однако, № 2. Почему я не могу использовать printf? – Aaron

+0

@Aaron: Вы используете компилятор C++? – EOF

+0

@ Аарон, нет причин, почему №1 не будет работать. Если вы можете обновить свой пост с помощью дополнительной информации и обновленного кода, мы можем понять это. –

0

Добавить #include "list.h" в list.c. Когда gcc пытается скомпилировать последнее, локальный вызов компилятора не знает о struct nodeStruct, потому что его определение не было включено в локальный файл.

Примечание: это основано на вашем обновлении, в котором struct nodeStruct определен в list.h.