首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在作为链表的队列哈希表中插入错误?

在作为链表的队列哈希表中插入错误?
EN

Stack Overflow用户
提问于 2012-10-11 08:00:43
回答 1查看 152关注 0票数 0

我已经为队列实现了以下代码作为一个链表。现在,我正在尝试获取一个哈希表,它是一个队列数组,也是一个链表。它工作得很好,直到我在删除后插入。

所做的是将队列实现为链表。因此,当我想删除的时候,我删除了head元素,而对于insert,我使用了tail。

为了创建一个哈希表,我按照键的插入顺序维护了另一个链表。删除首先删除这个键并转到那个单独的链表,然后删除头部并更新头部。

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>

struct Node{
   int value;
   struct Node *next;
   struct Node* head;
   struct Node* tail;

};



struct Node* lruhashtable[10];
struct Node* trackHead;
struct Node* trackTail;


 void insert(int page)
 {
  if(trackHead==NULL)
  {

    trackHead=malloc(sizeof(struct Node));
    trackHead->value=(page-1)%10;
    trackHead->next=NULL;
    trackTail=trackHead;        
}
else
{
    struct Node* temp=malloc(sizeof(struct Node));
    temp->value=(page-1)%10;
    temp->next=NULL;
    trackTail->next=temp;
    trackTail=temp;

 }


}

void hashEntry(int page)
{
 struct Node** iter;
 iter=&lruhashtable[(page-1)%10];
 for(;*iter;iter=&(*iter)->next);
   *iter = malloc(sizeof **iter );

 (*iter)->value = page;  
 (*iter)->next = NULL;
 if((*iter)->head==NULL)  
 {
    (*iter)->head=*iter;
    (*iter)->tail= (*iter)->head;

 }
 else
 {
    (*iter)->tail->next=*iter;
    (*iter)->tail=*iter;


 }
 insert(page);


}

void deleteInHashEntry()
 {
  int pageToDelete=delete();

struct Node** iter;
iter=&lruhashtable[pageToDelete];
if((*iter)->head!=NULL)
{        
struct Node* curr=(*iter)->head;
(*iter)=curr->next;
if((*iter)!=NULL)
    (*iter)->head=*iter;
free(curr);

}
else
{
    (*iter)->tail=NULL;

}


  }

void print()
{

int i;
struct Node **iter;
for(i=0;i<10;i++)
{
    iter=&lruhashtable[i];
    for(;*iter;iter=&(*iter)->next)
    {            
        printf("%d%s%d\n",(*iter)->value,"--",i);
    }


}

 }




int delete()
{
int page=-1;

if(trackHead!=NULL)
{
struct Node*current=trackHead;
page=current->value;    
trackHead=current->next;
free(current);
}
else
{
   trackTail=NULL;

}
return page;

 } 


 void printTrack()
 {  
   struct Node* temp=trackHead;

while(temp!=NULL)
{
    printf("%d",temp->value);
    printf("\n");
    temp=temp->next;   
}


}

int main()
{

hashEntry(1);
hashEntry(11);
hashEntry(2);
hashEntry(3);
hashEntry(22);
hashEntry(4);
hashEntry(33);

print();
printTrack();
deleteInHashEntry();
print();
printTrack();
deleteInHashEntry();
print();
printTrack();
deleteInHashEntry();
print();
printTrack();
hashEntry(1);
hashEntry(11);
hashEntry(22);
deleteInHashEntry();
deleteInHashEntry();
deleteInHashEntry();
deleteInHashEntry();
deleteInHashEntry();
deleteInHashEntry();
deleteInHashEntry();
return 0;

 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-11 10:48:35

GDB来拯救我,我想我应该在之前就捕捉到它,在函数hashEntry if((*iter)->head==NULL)中,这个语句是错误的,因为每次这个语句都会在malloc之后执行。添加了一个状态变量,用于在malloc语句之前执行此检查,并将if条件更改为if状态。希望这是唯一的bug。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12830267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档