这是完整的代码。如果在插入元素的主要部分中,我们运行循环的次数少于30次,则运行。否则它没有。程序崩溃并给出错误“在线编译器超出时间限制”。我想看到插入到数组列表中的所有100个随机元素的输出。但程序因为不明原因而崩溃了。
这是主要的
int main()
{
node* a[100],*b,*temp,*temp2;
int num;
for(int i=0;i<100;i++)
{
a[i]=NULL;;
}
for(int i=0;i<100;i++) // If this loop is less than 30 , it runs
{
num=(1+ (rand() %100) );
insert_node(a,num);
}
display(a);
}
这是插入功能
void insert_node(node **q,int data)
{
node *temp,*temp2;
int pos;
pos=hash_function(data);
if(q[pos]==NULL)
{
temp=new node;
temp->next=NULL;
temp->data=data;
q[pos]=temp;
}
else
{
temp2=q[pos];
while(temp2->next != NULL )
{
temp2=q[pos];
temp2=temp2->next;
}
temp=new node;
temp->next=NULL;
temp->data=data;
temp2->next=temp;
}
}
这是noobie哈希函数。
int hash_function(int data)
{
return 1+(rand() %100);
}
这是显示一个
void display(node **q)
{
node * temp;
for(int i=0;i<100;i++)
{
temp=q[i];
if(temp !=NULL)
{
cout<<"\n Position : "<<i<<" , Elements : ";
while(temp->next != NULL)
{
cout<<" "<<temp->data;
temp=temp->next;
}
cout<<" "<<temp->data;
}
}
}
PS:请不要判断我对哈希的尝试。真的是一个菜鸟程序员。谢谢你的推荐。
答案 0 :(得分:2)
这里有一个无限循环:
temp2=q[pos];
while(temp2->next != NULL )
{
temp2=q[pos];
temp2=temp2->next;
}
每次循环播放都会将temp2
设置回q[pos]
,然后再转到下一个。所以你永远不会超过链表的第二个元素,它永远不会找到NULL
指针。
摆脱循环中的temp=q[pos];
行,它应该在循环之前完成一次。
另一个问题是数组索引是从零开始的,因此在计算哈希码时不应添加1
。
int hash_function(int data)
{
return (rand() %100);
}