HASH表中解决冲突的方法(链址法)————双链表

  1. // DEBUG2.cpp : Defines the entry point for the console application.
  2. //
  3. // data.cpp : 定义控制台应用程序的入口点。
  4. //
  5. #include "stdafx.h"
  6. #include "stdio.h"
  7. #include "stdlib.h"
  8. #define HASHSIZE 6999999
  9. #define DATASIZE 2000
  10. #define I_USED 1
  11. #define I_UNUSED 0
  12. typedef unsigned int __u32;
  13. typedef unsigned short __u16;
  14. typedef unsigned char __u8;
  15. int DATACOUNT=DATASIZE;
  16. int HASHCOUNT=0;
  17. struct _data
  18. {
  19. __u32 saddr; 
  20. __u32 ext_isn;
  21. __u32 int_isn;
  22. __u16 sport; 
  23. __u8 int_ok;
  24. __u8 three_shake;
  25. __u8 fin_count;
  26. char flag;
  27. __u32 head;
  28. struct _data *next;
  29. struct _data *prev;
  30. }data_list[DATASIZE],*data_hash[HASHSIZE];
  31. struct _data *data_head;
  32. struct _data *data_tail;
  33. int  alloc_data_inode(__u16 sport, __u32 saddr ,__u32  ext_isn,__u32 index)
  34. {
  35.  struct _data *pcb_p;
  36.  if(DATACOUNT>1){
  37.  /*CUT DATA_TAIL OF DATA_LINK*/
  38.  if(data_tail!=NULL){
  39.   pcb_p=data_tail;
  40.   (pcb_p->prev)->next=NULL;
  41.   data_tail=pcb_p->prev;
  42.   pcb_p->prev=NULL;
  43.   DATACOUNT--;
  44.  }
  45.  else if(data_tail==data_head){
  46.   pcb_p=data_tail=data_head;
  47.  }
  48.  else{
  49.   printf("inodes have been used!!");
  50.  }
  51.   
  52.  /*add to the hashtable's collision link table*/
  53.    if( data_hash[index] != NULL )  
  54.     {
  55.      data_hash[index]->prev=pcb_p;
  56.      pcb_p->next = data_hash[index];
  57.      pcb_p->prev=NULL;
  58.      data_hash[index]=pcb_p;
  59.      HASHCOUNT++;
  60.     }
  61.     else if(data_hash[index]==NULL)
  62.      {
  63.      data_hash[index]=pcb_p;
  64.      pcb_p->next=NULL;
  65.      pcb_p->prev=NULL;
  66.      HASHCOUNT++;
  67.     }
  68.    /*init the data into the pcb_p;*/
  69.     pcb_p->saddr=saddr;
  70.     pcb_p->sport=sport;
  71.     pcb_p->ext_isn=ext_isn;
  72.     pcb_p->three_shake=1;
  73.     pcb_p->head=index;
  74.     pcb_p->flag=I_USED;
  75.      return 0;
  76.  }else{
  77.   printf("inodes have been used!!");
  78.   
  79.  }
  80. }
  81. int detach_pcb(struct _data *pcb_p,__u32 index,__u16 sport,__u32 saddr)
  82. {
  83. // char j;
  84.  while( data_hash[index] != NULL )
  85.  {
  86.    
  87.   if( pcb_p->saddr==saddr && pcb_p->sport==sport )
  88.   {
  89.    //delete it from data_link and add to the data_tail
  90.    //MIDDLE
  91.    if(pcb_p->next !=NULL&&pcb_p->prev !=NULL )
  92.     {
  93.      
  94.      (pcb_p->prev)->next=pcb_p->next;
  95.      (pcb_p->next)->prev=pcb_p->prev;
  96.      data_head->prev=pcb_p;
  97.      pcb_p->prev=NULL;
  98.      pcb_p->next=data_head;
  99.      data_head=pcb_p;
  100.         
  101.    }//TAIL
  102.    else if(pcb_p->next==NULL&&pcb_p->prev!=NULL)
  103.     { 
  104.      (pcb_p->prev)->next=NULL;
  105.      pcb_p->prev=NULL;
  106.      data_head->prev=pcb_p;
  107.      pcb_p->prev=NULL;
  108.      pcb_p->next=data_head;
  109.      data_head=pcb_p;
  110.    }//HEAD
  111.       else if(pcb_p->next!=NULL&&pcb_p->prev==NULL)
  112.     { 
  113.      data_hash[index]=data_hash[index]->next;
  114.      (pcb_p->next)->prev=NULL;
  115.      pcb_p->next=NULL;
  116.      data_head->prev=pcb_p;
  117.      pcb_p->prev=NULL;
  118.      pcb_p->next=data_head;
  119.      data_head=pcb_p;
  120.    }
  121.   /* else if(pcb_p->next==NULL && pcb_p->prev){ 
  122.     data_hash[index]=NULL;
  123.     data_head->prev=pcb_p;
  124.     pcb_p->prev=NULL;
  125.     pcb_p->next=data_head;
  126.     data_head=pcb_p;
  127.    }*/
  128.     pcb_p->saddr=0;
  129.     pcb_p->sport=0;
  130.     pcb_p->three_shake=0;
  131.     pcb_p->ext_isn=0;
  132.     pcb_p->fin_count=0;
  133.     pcb_p->int_isn=0;
  134.     pcb_p->int_ok=0;
  135.     pcb_p->flag=I_UNUSED;
  136.     pcb_p->head=0; 
  137.     return 0; //detach sucessful!
  138.   }else{
  139.    if(pcb_p->next!=NULL){
  140.     pcb_p=pcb_p->next;
  141.    }else{
  142.     printf("NO INODE!!!");
  143.     break;
  144.    }
  145.   }
  146.   
  147.  }
  148.  return -1;
  149. }
  150. struct _data * lookup_pcb(__u32 saddr,__u16  sport,__u32 index)
  151. {
  152.  struct _data *pcb_p;
  153.  if( data_hash[index] != NULL )
  154.  {
  155.   pcb_p = data_hash[index];
  156.   while( pcb_p != NULL )
  157.   {
  158.    if( pcb_p->saddr==saddr && pcb_p->sport==sport )
  159.    {
  160.     
  161.     return pcb_p;
  162.    }
  163.    else
  164.    {
  165.     pcb_p = pcb_p->next;
  166.    }
  167.   }
  168.  }
  169.  return NULL;
  170. }
  171. void init_data(int i)
  172. {
  173.  data_head=&data_list[0];
  174.  data_tail=&data_list[DATASIZE-1];
  175.  for(i=0;i<DATASIZE;i++)
  176.  {
  177.   if(i == 0)
  178.   {
  179.    data_list[i].prev = NULL;
  180.    data_list[i].next = &data_list[1];
  181.   }
  182.   else if(i == (DATASIZE-1))
  183.   {
  184.    data_list[i].next= NULL;
  185.    data_list[i].prev=&data_list[i-1];
  186.   }
  187.   else
  188.   {
  189.    data_list[i].next= &data_list[i+1];
  190.    data_list[i].prev=&data_list[i-1];
  191.   }
  192.   
  193.   data_list[i].int_ok=0;
  194.   data_list[i].three_shake=0;
  195.   data_list[i].sport=0;
  196.   data_list[i].saddr=0;
  197.   data_list[i].ext_isn=0;
  198.   data_list[i].int_isn=0;
  199.   data_list[i].fin_count=0;
  200.   data_list[i].head=0;
  201.   data_list[i].flag=I_UNUSED;
  202.    }
  203.  for(i=0;i<HASHSIZE;i++)
  204.   data_hash[i]=NULL;
  205. }
  206. int main(int argc, char* argv[])
  207. {
  208.  int i;
  209.  int j=0;
  210.  int x=0;
  211.  __u32 saddr;
  212.  __u16 sport;
  213.  struct _data *pPtr;
  214.  init_data(1);
  215.  printf("data_init sucessful/n");
  216.  for(i=0;i<DATASIZE;i++)
  217.  {
  218.   
  219.   alloc_data_inode(123+i,987654+i,98765432+i,123456);
  220.   printf("i=%d/n",i);
  221.  }
  222.  printf("-------------------------/nDATACOUNT=%d/n",DATACOUNT);
  223.  printf("-------------------------/nHASHCOUNT=%d/n",HASHCOUNT);
  224.  pPtr=data_hash[123456];
  225.  while(pPtr!=NULL)
  226.  {
  227.   printf("(%d)%p:prev=%p,next=%p[saddr=%d,sport=%d]/n",x,pPtr,pPtr->prev,pPtr->next,pPtr->saddr,pPtr->sport);
  228.   pPtr=pPtr->next;
  229.   x++;
  230.  }
  231.  printf("-----------------------------------------/n");
  232.  x=0;
  233.  pPtr=data_hash[123456];
  234.  for(i=0;i<DATASIZE;i++)
  235.  {
  236.   saddr=987654+i;
  237.   sport=123+i;
  238.   detach_pcb(pPtr,123456,sport,saddr);
  239.   printf("(%d)delect:%d,pPtr=%p,pPtr->sport=%p/n",x,i,pPtr,pPtr->sport);
  240.   x++;
  241.  }
  242. printf("-----------------------------------------/n");
  243.   pPtr=data_hash[123456];
  244.   x=0;
  245.  while(pPtr!=NULL)
  246.  {
  247.   printf("(%d)%p:prev=%p,next=%p[saddr=%d,sport=%d]/n",x,pPtr,pPtr->prev,pPtr->next,pPtr->saddr,pPtr->sport);
  248.   pPtr=pPtr->next;
  249.   x++;
  250.  }
  251.  printf("-----------------------------------------/n");
  252.  for(i=0;i<DATASIZE-1;i++)
  253.  {
  254.  pPtr=lookup_pcb(987654+i,123+i,123456);
  255.  if(pPtr!=NULL)
  256.  {
  257.   j++;
  258.   printf("i=%d found it/n",i);
  259.  }
  260.  if(pPtr==NULL)
  261.   printf("i=%d not found/n",i);
  262.  }
  263.  pPtr=data_hash[123456];
  264.  while(pPtr!=NULL)
  265.  {
  266.   printf("(%d)%p:prev=%p,next=%p[saddr=%d,sport=%d]/n",x,pPtr,pPtr->prev,pPtr->next,pPtr->saddr,pPtr->sport);
  267.   pPtr=pPtr->next;
  268.   x++;
  269.  }
  270.  //exit(0);
  271.  return 0;
  272. }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值