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 20
  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. struct _data *cl_next;
  31. struct _data *cl_prev;
  32. }data_list[DATASIZE],*data_hash[HASHSIZE];
  33. struct _data *data_head;
  34. struct _data *data_tail;
  35. //cut cl_prev and cl_next form data_hash
  36. void  del_coll(struct _data *pcb_p,__u32 index){
  37.  if(data_hash[index]!=NULL){
  38.   if(pcb_p->cl_prev==NULL && pcb_p->cl_next==NULL){
  39.    data_hash[index]=NULL;
  40.   }else if(pcb_p->cl_prev==NULL && pcb_p->cl_next!=NULL){
  41.    (pcb_p->cl_next)->cl_prev=NULL;
  42.    data_hash[index]=pcb_p->cl_next;
  43.    pcb_p->cl_next=NULL;
  44.   }else if(pcb_p->cl_prev!=NULL && pcb_p->cl_next!=NULL){
  45.    
  46.    (pcb_p->cl_next)->cl_prev=pcb_p->cl_prev;
  47.    (pcb_p->cl_prev)->cl_next=pcb_p->cl_next;
  48.    pcb_p->cl_next=NULL;
  49.    pcb_p->cl_prev=NULL;
  50.   }else if(pcb_p->cl_prev!=NULL && pcb_p->cl_next==NULL){
  51.    
  52.    (pcb_p->cl_prev)->cl_next=NULL;
  53.    pcb_p->cl_prev=NULL;
  54.   }
  55.  }
  56. }
  57. int  alloc_data_inode(__u16 sport, __u32 saddr ,__u32  ext_isn,__u32 index)
  58. {
  59.  struct _data *pcb_p;
  60.  /*CUT DATA_TAIL OF DATA_LINK*/
  61.    if(data_tail->flag&I_USED){
  62.     
  63.     del_coll(data_tail,index);
  64.    }
  65.    pcb_p=data_tail;
  66.    (data_tail->prev)->next=NULL;
  67.    data_tail=data_tail->prev;
  68.    pcb_p->prev=NULL;
  69.    pcb_p->next=data_head;
  70.    data_head->prev=pcb_p;
  71.    data_head=pcb_p;
  72.    pcb_p->prev=NULL;
  73.   
  74.  /*add to the hashtable's collision link table*/
  75.    if( data_hash[index] != NULL )  
  76.     {
  77.      data_hash[index]->cl_prev=pcb_p;
  78.      pcb_p->cl_next = data_hash[index];
  79.      pcb_p->cl_prev=NULL;
  80.      data_hash[index]=pcb_p;
  81.      HASHCOUNT++;
  82.     }
  83.     else if(data_hash[index]==NULL)
  84.      {
  85.      data_hash[index]=pcb_p;
  86.      pcb_p->cl_next=NULL;
  87.      pcb_p->cl_prev=NULL;
  88.      HASHCOUNT++;
  89.     }
  90.    /*init the data into the pcb_p;*/
  91.     pcb_p->saddr=saddr;
  92.     pcb_p->sport=sport;
  93.     pcb_p->ext_isn=ext_isn;
  94.     pcb_p->three_shake=1;
  95.     pcb_p->head=index;
  96.     pcb_p->flag=I_USED;
  97.     
  98.      return 0;
  99.   
  100. }
  101. int detach_pcb(struct _data *pcb_p,__u32 index,__u32 saddr,__u16  sport) 
  102. {
  103.  while(data_hash[index]!=NULL){
  104.   if( pcb_p->saddr==saddr && pcb_p->sport==sport )
  105.   { 
  106.    
  107.    printf("%p:prev=%p,next=%p,cl_prev=%p,cl_next=%p[saddr=%d,sport=%d]/n",pcb_p,pcb_p->prev,pcb_p->next,pcb_p->cl_prev,pcb_p->cl_next,pcb_p->saddr,pcb_p->sport); 
  108.    
  109.    del_coll(pcb_p,index);
  110.    if(pcb_p->next!=NULL && pcb_p->prev==NULL){
  111.     (pcb_p->next)->prev=NULL;
  112.     data_head=pcb_p->next;
  113.     pcb_p->next=NULL;
  114.     pcb_p->prev=data_tail;
  115.     data_tail->next=pcb_p;
  116.     data_tail=pcb_p;
  117.     pcb_p->next=NULL;
  118.    }else if(pcb_p->next!=NULL && pcb_p->prev!=NULL){
  119.     (pcb_p->next)->prev=pcb_p->prev;
  120.     (pcb_p->prev)->next=pcb_p->next;
  121.     pcb_p->next=pcb_p->prev=NULL;
  122.     pcb_p->prev=data_tail;
  123.     data_tail->next=pcb_p;
  124.     data_tail=pcb_p;
  125.     pcb_p->next=NULL;
  126.    }
  127.      pcb_p->saddr=0;
  128.      pcb_p->sport=0;
  129.      pcb_p->three_shake=0;
  130.      pcb_p->ext_isn=0;
  131.      pcb_p->fin_count=0;
  132.      pcb_p->int_isn=0;
  133.      pcb_p->int_ok=0;
  134.      pcb_p->flag=I_UNUSED;
  135.      pcb_p->head=0; 
  136.      return 0; //detach sucessful!
  137.   }
  138.   else{
  139.    if(pcb_p->cl_next!=NULL)
  140.     pcb_p=pcb_p->cl_next;
  141.    else
  142.     return -1;
  143.    } 
  144.   }
  145.  }
  146.  if(data_hash[index]==NULL){
  147.   printf("out of delete size!/n");
  148.   return -1;
  149.  }
  150.    
  151.  return -1;
  152. }
  153. struct _data * lookup_pcb(__u32 saddr,__u16  sport,__u32 index)
  154. {
  155.  struct _data *pcb_p;
  156.  if( data_hash[index] != NULL )
  157.  {
  158.   pcb_p = data_hash[index];
  159.   while( pcb_p != NULL )
  160.   {
  161.    if( pcb_p->saddr==saddr && pcb_p->sport==sport )
  162.    {
  163.     
  164.     return pcb_p;
  165.    }
  166.    else
  167.    {
  168.     pcb_p = pcb_p->cl_next;
  169.    }
  170.   }
  171.  }
  172.  return NULL;
  173. }
  174. void init_data(int i)
  175. {
  176.  data_head=&data_list[0];
  177.  data_tail=&data_list[DATASIZE-1];
  178.  for(i=0;i<DATASIZE;i++)
  179.  {
  180.   if(i == 0)
  181.   {
  182.    data_list[i].prev = NULL;
  183.    data_list[i].next = &data_list[1];
  184.   }
  185.   else if(i == (DATASIZE-1))
  186.   {
  187.    data_list[i].next= NULL;
  188.    data_list[i].prev=&data_list[i-1];
  189.   }
  190.   else
  191.   {
  192.    data_list[i].next= &data_list[i+1];
  193.    data_list[i].prev=&data_list[i-1];
  194.   }
  195.   data_list[i].cl_next=NULL;
  196.   data_list[i].cl_prev=NULL;
  197.   data_list[i].int_ok=0;
  198.   data_list[i].three_shake=0;
  199.   data_list[i].sport=0;
  200.   data_list[i].saddr=0;
  201.   data_list[i].ext_isn=0;
  202.   data_list[i].int_isn=0;
  203.   data_list[i].fin_count=0;
  204.   data_list[i].head=0;
  205.   data_list[i].flag=I_UNUSED;
  206.    }
  207.  for(i=0;i<HASHSIZE;i++)
  208.   data_hash[i]=NULL;
  209. }
  210. int main(int argc, char* argv[])
  211. {
  212.  int i;
  213.  int j=0;
  214.  int x=0;
  215.  struct _data *pPtr;
  216.  __u32 saddr;
  217.  __u16 sport; 
  218.  init_data(1);
  219.  printf("data_init sucessful/n");
  220.  //ALLOC
  221.  for(i=0;i<99999;i++)
  222.  {
  223.   alloc_data_inode(123+i,987654+i,98765432+i,123456);
  224.   printf("i=%d/n",i);
  225.  }
  226.  pPtr=data_hash[123456];
  227.  //分配
  228.  while(pPtr!=NULL)
  229.  { printf("<<%d>>",x);
  230.   printf("%p:prev=%p,next=%p,cl_prev=%p,cl_next=%p[saddr=%d,sport=%d]/n",pPtr,pPtr->prev,pPtr->next,pPtr->cl_prev,pPtr->cl_next,pPtr->saddr,pPtr->sport);
  231.   pPtr=pPtr->cl_next;
  232.   x++;
  233.  }
  234.  printf("------------------------------------------------/n");
  235.  pPtr=data_head;
  236.  //dell
  237.  for(i=0;i<7;i++)
  238.  {
  239.   saddr=1087635+i;
  240.   sport=34568+i;
  241.   detach_pcb(pPtr,123456,saddr,sport);
  242.  }
  243.  for(i=0;i<DATASIZE;i++)
  244.  {
  245.  pPtr=lookup_pcb(1087633+i,34566+i,123456);
  246.  if(pPtr!=NULL)
  247.  {
  248.   j++;
  249.   printf("i=%d found it/n",i);
  250.  }
  251.  if(pPtr==NULL)
  252.   printf("i=%d not found/n",i);
  253.  }
  254.  pPtr=data_head;
  255.  while(pPtr!=NULL)
  256.  {
  257.   printf("%p:prev=%p,next=%p,cl_prev=%p,cl_next=%p[saddr=%d,sport=%d]/n",pPtr,pPtr->prev,pPtr->next,pPtr->cl_prev,pPtr->cl_next,pPtr->saddr,pPtr->sport);
  258.   pPtr=pPtr->cl_next;
  259.  }
  260.  printf("found %d inode/n",j);
  261.   scanf("%d",&i);
  262.  return 0;
  263. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值