使用链接列表扩展哈希表有一些错误和警告。我想确保以下代码是正确的(扩展功能)并找出引发这些警告/错误的事件
编辑:感谢@ nos ,他们发现我的原型错过了警告+错误,我提到了。不幸的是现在有这个:“在功能expand': undefined reference to
添加'collect2:ld返回1退出状态
EDIT2:我注意到add函数返回一个List *,它在扩展函数上没有变量来“获取”它。我在那里放了一个值......但错误仍然存在:/
EDIT3:分段错误:(运行gdb: * glibc检测到 损坏的双链表:0x0804c6b0 * *已更正。新添加功能增加。
编辑:查找功能上的strcmp上的分段错误。使用gdb运行:
(gdb)bt full
查找中0 0x080487b9(哈希表= 0x804b008,哈希值= 27,
number=0xbffff3f2 "6900101001") at pro.c:80 list = 0xffffffff
1 0x0804883b in add(hashtable = 0x804b008,
number=0xbffff3f2 "6900101001", name=0x804b6e0 "Irgaedggfs",
时间= 6943) 在pro.c:96 new_elem = 0xffffffff hashval = 27
主要的2 0x08048bc1(prog:1,argv = 0xbffff4b4):234
number = "6900101001" name = 0x804b6e0 "Irgaedggfs" time = 6943
typedef struct
{
int length;
struct List *head;
} HashTable;
//resolving collisions using linked lists - chaining
typedef struct
{
char *number;
char *name;
int time;
struct List *next;
}List;
HashTable* expand( HashTable* h )
{
HashTable* new;
int n;
List *node,*next;
PrimesIndex++;
int new_size= primes[PrimesIndex]; /* double the size,odd length */
if (!(new=malloc((sizeof( List*))*new_size))) return NULL;
for(n=0; n< h->length; ++n) {
for(node=h[n].head; node; node=next) {
add (new, node->number, node->name,node->time);
next=node->next;
free(node);
}
}
free(h);
return new;
}
int add ( HashTable* hashtable,char number[10],char* name,int time)
{
List *new_elem;
int hashval=hash (hashtable,number);
new_elem=hashtable[hashval].head;
if(hashtable[hashval].length>0)
{
if ((lookup (hashtable,hashval,number))!=NULL) {return 0;}
}
if (!(new_elem=malloc(sizeof(struct List)))){ return -1;}
//insert values for the new elem
new_elem->number=strdup(number);
new_elem->name=strdup(name);
new_elem->time=time;
hashtable[hashval].head=new_elem;
new_elem->next=NULL;
hashtable[hashval].length++;
/* rehash existing entries if necessary */
if( TableSize(hashtable)>= 2*size])
{
hashtable = expand(hashtable);
if (hashtable ==NULL){
return 0;
}
}
return 1;
}
List *lookup ( HashTable *h ,int hashval,char number[10])
{
List *list=h[hashval].head;
for(list; list!=NULL; list=list->next){
if (strcmp(number,list->number)==0) //**SEGMENTATION**!!!!
return list;
}
return NULL;
}
答案 0 :(得分:1)
您需要在调用函数之前声明函数。否则,C将假设您的expand
函数返回一个int。
简单地说,在结构声明之后,在函数定义之前,将prototype这样的{{3}}放在文件的顶部。
HashTable* expand( HashTable* h ,char number[10],char* name,int time);
答案 1 :(得分:0)
在定义“expand”之前声明函数“add”,在其中使用“add”。
List * add(HashTable * hashtable,char number [10],char * name,int time);
在这里定义展开..
在此处定义添加...
答案 2 :(得分:0)
(我不知道如何更改计算机中的行;所以我必须发布新的答案而不是关注你的评论。对不起)
请尝试:
int add(HashTable ** phashtable,char number [10],char * name,int time){
...
if(hashTableSize( *phashtable)== 2*(primes[PrimesIndex])){
*phashtable = expand( *phashtable);
}
}
您可能需要修改“添加”并相应地调用“添加”。
我不确定这是否会有所帮助。至少这是一个错误。
错误是如果在添加调用中扩展Hashtable,则在add调用返回后,变量“hashtable”的值不会更改。