2012-10-11 43 views
0

我已經爲隊列實現了以下代碼作爲鏈表。現在我試圖將哈希表作爲一個隊列數組作爲鏈表。它工作正常,直到我刪除後插入。作爲鏈表在隊列散列表中插入錯誤?

正在做什麼是一個隊列被實現爲鏈表。所以當我想刪除,我刪除頭元素和插入我使用尾巴。

做一個哈希表,我維護另一個鏈接的列表按它們插入的順序。刪除從首先刪除該鍵並轉到單個鏈接列表並刪除頭部並更新頭部開始。

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

} 

回答

0

GDB救援,以爲我想我應該有以前好多捉住了它,在功能hashEntry if((*iter)->head==NULL)這種說法是錯誤的,因爲每次這樣的malloc之後將執行。添加一個STATUS變量在malloc語句之前執行此檢查,並在條件改爲if狀態時進行更改。希望這是唯一的錯誤。