gpt4 book ai didi

c - 哈希表 - 链表 - 段错误

转载 作者:行者123 更新时间:2023-11-30 14:25:40 26 4
gpt4 key购买 nike

我正在尝试使用链表链接实现哈希表。下面的代码有效 -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TABSIZ 200

struct record {
struct record *next;
char name[BUFSIZ];
int data;
};

static struct record *htable[TABSIZ];

unsigned hash(char *s)
{
unsigned h;

for (h = 0; *s; s++)
h = *s;
//printf("%d", h%TABSIZ);
//I know its not a good hash function but i wanted to check chaining
return h % TABSIZ;
}

struct record *find(char *name)
{
struct record *item;

for (item = htable[hash(name)]; item; item = item->next)
{
if (strcmp(name, item->name) == 0)
return item;
}

return NULL;
}

struct record *insert(char *name,int value)
{
struct record *item;
unsigned h;

if ((item = find(name)) == NULL)
{
if ((item = malloc(sizeof (*item))) == NULL)
return NULL;

strcpy(item->name, name);
item->data=value;
h = hash(name);
item->next = htable[h];
htable[h] = item;
}

return item;
}
void printTable()
{
int i=0;
struct record *temp;
for(i=0;i<=TABSIZ;i++)
{
temp=htable[i];
while(temp!=NULL)
{
printf("\n%d - %s - %d\n", i,temp->name, temp->data);
temp=temp->next;
}
}
}
int main(void)
{
char buf[BUFSIZ];int value;
struct record *item;
do{
printf("Enter the name of the student:\n");
scanf("%s", buf);
if(strcmp(buf,"stop")==0) break;
printf("Enter the marks of the student:\n");
scanf("%d", &value);
if(insert(buf, value)==NULL)
{
break;
}
}while((strcmp(buf,"stop"))!=0);

printf("Enter a name to find: ");
scanf("%s", buf);
if((item=find(buf))!=NULL)
printf("The marks of the student is %d\n", item->data);
else printf("\n Not Found\n");
printTable();
return 0;
}

现在我尝试删除全局变量并使用局部变量作为结构数组。我删除了 htable 的全局声明并将其在 main 中声明为

struct record *htable[TABSIZ];

并将功能更改为

struct record *find(struct record *htable, char *name);
struct record *insert(struct record *htable, char *name,int value);

我将这些函数称为

find(htable, name);
insert(htable,name,value);

但现在我的程序出现了段错误。我传递的结构数组正确吗?我是否正确声明了它?任何帮助将不胜感激。

最佳答案

我之前的回答走错了路。

当它是全局的时,它会自动初始化为0。

当它在main的堆栈上声明时,它没有被初始化。

main() 中添加一个 memset( htable, 0, sizeof(htable)) ,这应该会返回到之前的行为。

关于c - 哈希表 - 链表 - 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10109544/

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