Hashtable

时间:2018-02-04 12:42:36

标签: c segmentation-fault cs50

我试图实现一个存储英语单词的哈希表。简而言之,我使用了一系列链表(链接),我还没有完成整个程序,但只是实现了它需要一个单词输入并通过它搜索它哈希表,但它开始给我分段错误。请帮帮我这个...... 提前谢谢!

strcpy(new->s,val);

这就是我遇到分段错误的原因。

我的整个代码:

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

typedef struct node
{
string s;
struct node *next;
}node;

node* create(char*);

unsigned long sdbm(unsigned char*);

bool search(string s,node *first)
{
node *ptr=first;
bool found=false;

while(ptr->next!=NULL)
{
    if(strcmp(ptr->s,s)==0)
    {
        found=true;
        break;
    }

}

if(found==true)
return true;
else
return false;
}



int main(void)
{
node a[26];
printf("Enter the string\n");
string s=get_string();
unsigned long hashcode = sdbm((unsigned char*)s);
printf("The hashcode is %lu\n", hashcode);

a[hashcode].next=create(s);

printf("Enter the string to be searched among the ones you recently typed 
in\n");
string t=get_string();

if(search(t,&a[sdbm((unsigned char*)t)]) == true)
printf("found\n");
else
printf("not found\n");

}


node* create(string val)
{
node* new = malloc(sizeof(node));
if(new!=NULL)
{
    new->s="";

    strcpy(new->s,val);   // this is the part ehere I get Segmentation Fault
    new->next=NULL;
}

return new;

}

unsigned long
sdbm(unsigned char *str)
{
    unsigned long hash = 0;
    int c;

    while ((c = *str++)!=0)
        hash = c + (hash << 6) + (hash << 16) - hash;

    return hash%26;
}

1 个答案:

答案 0 :(得分:0)

在这里,您使用的是不是标准c头文件的头文件cs50.h。您可能知道在该头文件中有一行#define unsigned char* string,即此处string不是c++ string表示char*。因此,无论何时使用string,都会将其解释为char*。在create函数的代码中存在错误

 node* create(string val)
 {
   node* new = malloc(sizeof(node));
   if(new!=NULL)
   {
      new->s="";   //ERROR Here

      strcpy(new->s,val);   // this is the part ehere I get Segmentation Fault
      new->next=NULL;
   }
  return new;
 }

您为[{1}}分配了new类型的空间,但是您没有为node分配空间new->s,因此当您复制字符串时它正在解决分段错误。

你的代码应该是这样的:

pointer to char