【问题标题】:Inserting error in an hashtable of queues as linked list?在作为链表的队列哈希表中插入错误?
【发布时间】:2012-10-11 00:00:43
【问题描述】:

我已将以下队列代码实现为链表。现在我试图将一个哈希表作为一个队列数组作为一个链表。它工作正常,直到我在删除后进行插入。

正在做的是将队列实现为链表。因此,当我想删除时,我删除了 head 元素并使用 tail 插入。

为了做一个哈希表,我按照插入的顺序维护另一个键的链表。删除首先删除此键并转到该单独的链表并删除头部并更新头部。

#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;

 }

【问题讨论】:

    标签: c linked-list hashtable


    【解决方案1】:

    GDB 来救援,我想我之前应该已经抓住了它,在函数 hashEntry if((*iter)-&gt;head==NULL) 这个语句是错误的,因为每次它都会在 malloc 之后执行。在 malloc 语句之前添加了一个 STATUS 变量来执行此检查,并将 if 条件更改为 if 状态。希望这是唯一的错误。

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 2012-04-23
      • 2015-04-11
      • 2015-06-25
      • 2017-03-28
      • 2015-06-10
      • 2014-03-28
      • 1970-01-01
      相关资源
      最近更新 更多