gpt4 book ai didi

c - 展开链接哈希表。代码错误。[已更新-新问题]

转载 作者:行者123 更新时间:2023-11-30 16:02:52 26 4
gpt4 key购买 nike

使用链接列表扩展哈希表时会出现一些错误和警告。我想确保以下代码是正确的(扩展函数)并找出引发这些警告/错误的原因

编辑:感谢@nos,他注意到我的原型(prototype)缺少我提到的警告+错误。不幸的是现在有这样一个:“在函数expand': undefined reference add'collect2:ld返回1退出状态

编辑2:我注意到add函数返回一个List*,在expand函数上没有变量可以“获取”它。我在那里输入了一个值...但错误仍然存​​在:/

EDIT3:段错误 :( 使用 gdb 运行:* glibc 检测到 损坏的双链表:0x0804c6b0 ** 已更正。新添加添加了功能。

编辑:查找函数中 strcmp 的段错误。使用 gdb 运行:

(gdb) bt full

0 0x080487b9 in lookup (hashtable=0x804b008, hashval=27,

number=0xbffff3f2 "6900101001") at pro.c:80
list = 0xffffffff

1 0x0804883b in add (hashtable=0x804b008,

number=0xbffff3f2 "6900101001", name=0x804b6e0 "Irgaedggfs",

time=6943) at pro.c:96 new_elem = 0xffffffff hashval = 27

2 0x08048bc1 in main (argc=1, argv=0xbffff4b4) at pro.c: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;
}

最佳答案

您需要在调用函数之前声明它们。否则,除其他外,C 将假设您的 expand 函数返回一个 int。

简单地,放置一个 prototype就像文件顶部的这个一样,在结构声明之后、函数定义之前。

 HashTable* expand( HashTable* h ,char number[10],char* name,int time);

关于c - 展开链接哈希表。代码错误。[已更新-新问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4702864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com