2010-10-13 25 views
1

我有一個錯誤和警告試圖編譯我的鏈接列表實現在C鏈表錯誤

warning: assignment from incompatible pointer type

error: dereferencing pointer to incomplete type here is the list.h

#ifndef LIST_H 
#define LIST_H 
#include <stdio.h> 

typedef struct _ListElmt{ 

void    *data; 
struct ListElmt  *next; 

} ListElmt; 
typedef struct _List{ 

int     size; 
int     (*match)(const void *key1, const void *key2); 
void    (*destroy)(void *data); 

ListElmt    *head; 
ListElmt    *tail; 

} List; 

void list_init(List *list, void (*destroy)(void *data)); 

void list_destroy(List *list); 

int list_ins_next(List *list, ListElmt *element, const void *data); 

int list_rem_next(List *list, ListElmt *element, void **data); 

int list_size(const List *list); 

ListElmt *list_head(const List *list); 

ListElmt *list_tail(const List *list); 

int list_is_head(const ListElmt *element); 

int list_is_tail(const ListElmt *element); 

void *list_data(const ListElmt *element); 

ListElmt *list_next(const ListElmt *element); 
#endif 

這裏是list.c

#include <stdlib.h> 
#include <string.h> 
#include "List.h" 

void list_init(List *list, void (*destroy)(void *data)){ 

list->size = 0; 
list->destroy = destroy; 
list->head = NULL; 
list->tail = NULL; 

return; 
} 

void list_destroy(List *list){ 

void    *data; 

while(list_size(list) > 0){ 

    if(list_rem_next(list, NULL, (void **)&data) == 0 && list->destroy != NULL){ 

     list->destroy(data); 
    } 
} 
memset(list, 0, sizeof(List)); 
return; 
} 

int list_ins_next(List *list, ListElmt *element, const void *data){ 

ListElmt   *new_element; 

if((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL) // not yet understanded 
    return -1; 

new_element->data = (void *)data; 

if(element == NULL){ 
    if(list_size(list) == 0) 
     list->tail = new_element; 

    new_element->next = list->head; 
    list->head = new_element; 
} 

else{ 
    if(element->next == NULL) 
     list->tail = new_element; 

    new_element->next = element->next; 
    element->next = new_element; 
} 

list->size++; 
return 0; 
} 

int list_rem_next(List *list, ListElmt *element, void **data){ 

ListElmt   *old_element; 

if(list_size(list) == 0) 
    return -1; 

if(element == NULL){ // Handle removal of the head 

     *data = list->head->data; 
     old_element = list->head; 
     list->head = list->head->next; 

     if(list_size(list) == 1) 
      list->tail = NULL; 
} 

else{ // Handle removal from somewhere else 

    if(element->next == NULL) 
     return -1; 

    *data = element->next->data; 
    old_element = element->next; 
    element->next = element->next->next; 

    if (element->next == NULL) 
     list->tail = element; 
} 

free(old_element); 

list->size--; 
return 0; 
} 
+8

你的編譯器不給你錯誤的確切行? – 2010-10-13 16:20:47

+1

警告和錯誤適用於哪些行? – Chowlett 2010-10-13 16:21:42

+0

bug已經在短時間內被codaddict修復了... – giri 2010-10-13 17:12:47

回答

4

變化

struct ListElmt *next; 

struct _ListElmt *next; 
struct _ListElmt定義

list.h

0

最後一行list.c(}來自不兼容的指針typeBlockquote)對我來說看起來很可疑。