0

リンクリストとしてキューに次のコードを実装しました。今、私はリンクリストとしてキューの配列としてハッシュテーブルを取得しようとしています。削除してから挿入するまでは問題なく動作します。

実行されているのは、キューがリンクリストとして実装されていることです。したがって、削除する場合は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;

 }
4

1 に答える 1

0

GDBを救助するために、私はずっと前にそれを捕まえるべきだったと思いました。関数hashEntryで、if((*iter)->head==NULL)これはmallocの後に実行されるたびに、このステートメントは間違っています。mallocステートメントの前にこのチェックを実行し、if条件をifステータスに変更するためのSTATUS変数を追加しました。うまくいけば、これが唯一のバグです。

于 2012-10-11T02:48:34.900 に答える