不兼容的隐式函数声明

时间:2012-02-23 03:27:25

标签: c function hashtable

我正在尝试在C中编写HashTable的实现,并且我收到“不兼容的函数insertnode隐式声明”形式的错误,“之前的声明在这里”。 我无法弄清楚此代码中可能出现的问题。

在我从“put”方法调用insertnode方法的地方出现了问题。

#include<stdlib.h>
#include<stdio.h>
typedef struct list{
  int data;
  struct list *next;
  struct list * prev;
}list;
typedef struct hash_table{
  int size;
  struct  list ** table;
}hash_table;
int main(){
  int hash(int);
  list* insertnode(list*,int);
  void put(hash_table* ,int);
  list* findnode(list*,int);
  list* get(hash_table*,int);
  hash_table* ht = (hash_table *)malloc(sizeof(hash_table));
  ht->table = (list **)malloc(sizeof(list *)*10);
  int a[]={12,22,33,45,56,12,23,444,44,56,23};
  int i=0;
  for(i=0;i<10;i++)
    ht->table[i]=(list *)malloc(sizeof(list));
  for(i=0;i<11;i++){
    list * node=get(ht,a[i]);
    if(node!=NULL)
    put(ht,a[i]);
    else
      printf("DUPLICATE %d",node->data);
  }
}
void put(hash_table* ht,int data){
int index =  hash(data);
//insert at head of ht->table[index]
 (ht->table)[index]=(list *) insertnode((ht->table)[index],data);
}

list* insertnode(list * head,int data){
  list * newhead = (list *)malloc(sizeof(list));
  newhead->data = data;
  newhead->next = head;
  head->prev = newhead;
  newhead->prev = NULL;
    return newhead;
}

int hash(int data){
  return data%10;
}

list* get(hash_table* ht,int data){
  int index = hash(data);
  list *node=findnode((ht->table)[index],data);
  return node;
}

list* findnode(list* head,int data){
  while(head!=NULL){
    if(head->data==data)
      return head;
    head = head->next;
  }
  return NULL;
}

1 个答案:

答案 0 :(得分:2)

insertnode函数中声明 main。该声明在main之外不可见。

然后在insertnode功能中调用put。那时,insertnode没有明显的声明。从C99开始,这是违反约束的行为。

然后在insertnode的定义之后定义 put

解决方案是坚持在调用它们时可以看到所有函数的声明。

在其他函数中声明函数很少有意义。对于像这样没有递归的小程序,您可以只是命令定义,以便在调用时一切都可见。或者,您可以在任何函数定义之前在文件顶部放置单独的声明。 (在较大的程序中,您的声明将位于.h头文件中。)

函数声明类似于:

list *insertnode(list*, int);

它使编译器可以处理对函数的调用。

定义包含定义函数功能的块{ /* ... */ }。它还提供了声明。