• 散列技术之链地址法(基于无序链表)


    源码例如以下:

    #include <stdlib.h>
    #include <stdio.h>
    #define hash(v,M) (v % M)
    typedef char Key;
    struct Item{
    	Key key;
    };
    typedef struct STnode* link;
    struct STnode{
    	Item item ; link next;
    };
    
    
    static link* heads , z ;
    static struct Item NULLitem ;
    static int N , M ;
    
    
    Key key(Item item){
    	return item.key;
    }
    //创建一个节点 
    static link NEW(Item item, link next){
    	link x = (link)malloc(sizeof *x);
    	x->item = item;x->next = next;
    	return x;
    }
    //初始化 
    void STinit(int max){
    	int i ;
    	N = 0; M = max / 5;
    	heads = (link *)malloc(M*sizeof(link));
    	z = NEW(NULLitem,NULL);
    	for(i=0;i<M;i++)heads[i] = z;
    }
    //节点个数 
    int STcount(){
    	return N; 
    } 
    //搜索子程序 
    Item searchR(link h, Key v){
    	Key t = key(h->item);
    	if(h==z)return NULLitem;
    	if(v==t) return h->item;
    	return searchR(h->next,v);
    }
    //搜索主程序 
    Item STsearch(Key v){
    	return searchR(heads[hash(v,M)],v);
    }
    
    
    //插入主程序 
    void STinsert(Item item){
    	int i = hash(key(item),M) ;
    	heads[i] = NEW(item,heads[i]); N++;
    }
    
    
    //单链表删除指定的节点  非递归 
    link deleteT(link head,Item v){
    	link node1=head;
    	link node2=NULL;
    	if (head==NULL)return NULL;
    	if (node1->item.key==v.key){
    		head=head->next;
    		free(node1);
    		return head;
    	}
    	while (node1!=NULL){
    		node2=node1;
    		node2=node2->next;
    		if (node2->item.key==v.key){
    			node1->next=node2->next;
    			free(node2);
    			break;
    		}
    		node1=node1->next;
    	}
    	return head;
    }
    
    
    
    
    //单链表删除指定的节点  递归 
    link deleteR(link h,Item item){
    	if(h==NULL)return NULL;
    	if(key(h->item) == key(item))return h->next;
    	h->next = deleteR(h->next,item);
    	return h;
    }
    
    
    void STdelete(Item item){
    	int i = hash(key(item),M) ;
    	heads[i] = deleteR(heads[i],item);
    }
    
    
    void p(link h){
    	link t = h;
    	while(t!=NULL){
    		printf("%c ",key(t->item));
    		t = t->next;
    	}
    	printf("
    ");
    	
    }
    main(){
    	STinit(26);
    	struct Item item[13] ={'a','s','e','r','c','h','i','n','g','x','m','p','l'};
    	int i;
    	for(i = 0; i<13;i++)
    		STinsert(item[i]);
    	for(i = 0; i<M;i++)
    		p(heads[i]);
    	printf("search: %c 
    ",key(STsearch('e')));
    	struct Item delItem = {'a'};
    	STdelete(delItem);
    	for(i = 0; i<M;i++)
    		p(heads[i]);
    	
    	
    }

    执行结果


  • 相关阅读:
    2019-11-4:渗透测试,bypass学习,笔记
    2019-11-3:渗透测试,基础学习,bypass类型笔记
    Linux常用命令集合
    HBase(0.96以上版本)过滤器Filter详解及实例代码
    Hadoop安全模式
    Linux学习笔记--一些错误的记录
    GUG记录
    为什么 1000 == 1000会返回false,100 == 100会返回true
    关于解决mysql数据库乱码的问题
    《MVC实现用户权限》
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7087240.html
Copyright © 2020-2023  润新知