不兼容的函数隐式声明
问题描述:
我想在C中编写一个HashTable的实现,并且我得到了“不兼容的隐式声明函数insertnode”,“之前的声明在这里)的错误。弄清楚了什么问题在这个代码。不兼容的函数隐式声明
东西是打破地方我打电话从“放”法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;
}
答
您声明insertnode
您main
函数中。该宣言在main
之外不可见。
你再调用insertnode
您put
函数中。此时,没有可见的insertnode
声明。从C99开始,这是违反约束的。
然后定义insertnode
定义put
后。
的解决方案是忍受,当你打电话给他们的所有函数的声明是可见的。
它很少有意义的申报等功能内部的功能。对于像这样没有递归的小程序,您可以对您的定义进行排序,以便在调用它时显示所有内容。或者你可以在你的任何函数定义之前在文件的顶部放置单独的声明。 (在一个更大的计划,你的声明将是一个.h
头文件)
函数声明是一样的东西:
list *insertnode(list*, int);
它使得编译器来处理的函数调用。
甲定义包括限定函数做什么块{ /* ... */ }
。它还提供了一个声明。
非常感谢... – code4fun 2012-02-23 03:54:39