zoukankan      html  css  js  c++  java
  • C 程序原子

     原子是一个指向唯一的、不可改变的0个或任意多个字节序列的指针。
     大多数原子都是指向以空字符结束的字符串,但是任何一个指向任意字节序列的指针都可以是原子。任何原子只可以出现一次。
     原子通常被当作数据结构中的关键字使用。
    Atom接口:(atom.h)
    #ifndef ATOM_INCLUDEED
    #define ATOM_INCLUDEED
    extern   int Atom_length(const char *str);
    extern const char *Atom_new(const char *str,int len);
    extern const char *Atom_string(const char *str);
    extern const char *Atom_int(long n);
    #endif
    
    实现:(atom.c)
    #include "atom.h"
    #include "limits.h"
    #include "mem.h"
    #define NELEMS(x) ((sizeof(x))/(sizeof((x)[0])))
    static struct atom{
      struct atom *link;
      int len;
      char *str;
    }*buckets[2048];
    
    
    const char *Atom_string(const char *str){
       assert(str);
       return Atom_new(str,strlen(str));
    }
    
    const char *Atom_int(long n){
      char str[43];
      char *s=str+sizeof(str);
      unsigned long m;
      if(n==LONG_MIN)
        m=LONG_MAX+1UL;
      else if(n<0)
        m=-n;
      else
        m=n;
      do{
    
        *--s=m%10+'0';
       }while((m/=10)>0);
      if(n<0)
        *--s='-';
      return Atom_new(s,(str+sizeof(str)-s));
    }
    
    
    const char *Atom_new(const char *str,int len){
       unsigned long h;
       int i;
       struct atom *p;
       assert(str);
       assert(len>=0);
       for(h=0,i=0; i<len; i++)
          h=(h<<1)+scatter[(unsigned char)str[i]];
       h&=NELEMS(buckets)-1;
       for(p=buckets[h];p;p=p->link){
         if(len==p->len){
            for(i=0;i<len&&p->str[i]==str[i];)
              i++;
            if(i==len)
              return p->str;
    
         }
       p=ALLOC(sizeof(*p)+len+1);
       p->len=len;
       p->str=(char*)(p+1);
       if(len>0)
         memcpy(p->str,str,len);
       p->str[len]='\0';
       p->link=buckets[h];
       buckets[h]=p;
    
       }
    
    }
    
    int Atom_length(const char *str){
    
      struct atom *p;
      int i;
      assert(str);
      for(i=0; i<NELEMS(buckets); i++)
         for(p=buckets[i]; p; p=p->link)
           if(p->str==str)
             return p->len;
      assert(0);
      return 0;
    
    }
    
  • 相关阅读:
    js中点击空白区域时文本框与隐藏层的问题
    嗨翻C语言
    人工模拟获取latch
    如何JOPtionPane的showConfirmDialog对话框button设置监视器
    本机Ajax异步通信
    Project Euler:Problem 28 Number spiral diagonals
    Maven软件项目管理工具
    第一个打击木马病毒查杀007一片:反向熊猫的分析(下一个)
    Redefine:Change in the Changing World
    不一致的文件编码读取和写入文件乱码解决方案
  • 原文地址:https://www.cnblogs.com/cpoint/p/2072763.html
Copyright © 2011-2022 走看看