如何解决我的哈希表中的指针损坏或丢失了某些内容?
这是我的代码,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct DF
{
char str[101];
int D;
struct DF *next;
} DF;
DF *df[5];
int hash (char str[])
{
int sum=0,len=strlen (str);
for (int x=0; x<len; x++) sum+=str[x];
return sum%5;
}
DF* ND (char str[])
{
DF *node=(DF*) malloc (sizeof (DF));
strcpy (node->str,str); node->D=1;
node->next=NULL;
return node;
}
void add (char str[])
{
int idx=hash (str);
if (df[idx])
{
DF *temp=df[idx];
while (temp) temp=temp->next;
temp=ND (str);
}
else df[idx]=ND (str);
}
int main (void)
{
char str1[]="The"; add (str1);
char str2[]="App"; add (str2);
if (df[4])
{
printf ("[4] %s",df[4]->str);
DF *temp=df[4]->next;
while (temp)
{
printf (" -> %s",temp->str);
temp=temp->next;
}
puts ("");
}
return 0;
}
请注意void add (char[])
,为什么输出不是[4] The -> App
?即使我将DF *temp=df[idx];
更改为DF *temp=df[idx]->next;
也没什么区别。但是如果我将其功能更改为此,
void add (char str[])
{
int idx=hash (str);
if (df[idx])
{
DF *temp=df[idx];
while (temp->next) temp=temp->next;
temp->next=ND (str);
}
else df[idx]=ND (str);
}
它打印出[4] The -> App
。那么,这两种算法有什么区别?
解决方法
第一种方式:
temp=ND (str);
只需分配一个局部变量,这样就不会对函数产生任何影响,因为您可能会发生内存泄漏(但是列表未修改,未添加元素)
但以第二种方式:
temp->next=ND (str);
修改链接列表
要工作,您可以修改第一种方法:
void add (char str[])
{
int idx=hash (str);
if (df[idx])
{
DF **temp=&df[idx];
while (*temp) temp=&(*temp)->next;
*temp=ND (str);
}
else df[idx]=ND (str);
}
但这很简单,除非您要删除if
:
void add (char str[])
{
DF ** temp=&df[hash(str)];
while (*temp)
temp=&(*temp)->next;
*temp=ND (str);
}
请注意,在同义词列表的末尾添加一个新单元格是没有用的,您没有全局顺序,可以直接这样做:
void add (char str[])
{
DF * temp=ND (str);
int idx=hash (str);
temp->next = df[idx];
df[idx] = temp;
}
在 ND 中:
strcpy (node->str,str); node->D=1;
很危险,因为 str 可能太长而无法保存在node->str
中,因此可以使用 strncpy
在逆向操作中,要保存的字符串很小时,您就失去了记忆。
不对字段 str 使用数组,而是使用char*
并复制字符串(例如,strdup
)怎么办?
在 hash 中,您需要两次遍历字符串,无需计算 strlen 即可使用
for (int x=0; str[x] != 0; x++) sum+=str[x];
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。