哈希表 - (代碼、分析 )

目錄:

    • 代碼:
    • 分析:

代碼:

BSTree.h
BSTree.c
二叉排序樹(Binary Sort Tree) 又稱為二叉查找樹(Binary Search Tree)

Hash.h

#ifndef _HASH_H_
#define _HASH_H_typedef void Hash;//定義哈希表類型
typedef void HashKey;//定義哈希表鍵類型
typedef void HashValue;//定義定義哈希表值類型typedef int (Hash_Compare)(HashKey*, HashKey*);//定義參數為兩個哈希表鍵類型指針返回值是整形的函數類型Hash* Hash_Create();//聲明創建哈希表函數
void Hash_Destroy(Hash* hash);//聲明銷毀哈希表函數
void Hash_Clear(Hash* hash);//聲明清空哈希表函數
int Hash_Add(Hash* hash, HashKey* key, HashValue* value, Hash_Compare* compare);//聲明添加值函數
HashValue* Hash_Remove (Hash* hash, HashKey* key, Hash_Compare* compare);//聲明移除值函數
HashValue* Hash_Get(Hash* hash, HashKey* key, Hash_Compare* compare);//聲明獲取值函數
int Hash_Count(Hash* hash);//聲明獲取數量函數#endif

Hash.c

#include <stdio.h>
#include <malloc.h>
#include "Hash.h"
#include "BSTree.h"typedef struct _tag_HashNode HashNode;//定義哈希表節點類型
struct _tag_HashNode
{BSTreeNode header;HashValue* value;
};
//定義遞歸釋放節點函數
void recursive_clear(BSTreeNode* node)
{if( node != NULL ){recursive_clear(node->left);recursive_clear(node->right);free(node);}
}Hash* Hash_Create()//定義創建哈希表函數
{return BSTree_Create();//創建一個樹
}void Hash_Destroy(Hash* hash)//定義銷毀哈希表函數
{Hash_Clear(hash);//清空哈希表BSTree_Destroy(hash);//再銷毀樹
}void Hash_Clear(Hash* hash)//定義清空哈希表函數
{//先清除釋放節點的空間。這釋放的其實是HashNode類型的空間//是在Hash_Add新建的node節點,因為轉換類型成樹的節點,但還是那塊內存開頭//所以會釋放HashNode中的Value.recursive_clear(BSTree_Root(hash));BSTree_Clear(hash);//再將樹清空重置
}
//定義添加值函數
int Hash_Add(Hash* hash, HashKey* key, HashValue* value, Hash_Compare* compare)
{int ret = 0;HashNode* node = (HashNode*)malloc(sizeof(HashNode));//新建節點if( ret = (node != NULL) )//創建成功{node->header.key = key;//將新建的鍵賦給樹點的鍵node->value = value;//將新建的值賦給哈希節點的值ret = BSTree_Insert(hash, (BSTreeNode*)node, compare);//將哈希轉換插入到樹if( !ret )//如果不成功釋放新建節點{free(node);}}return ret;
}
//定義移除值函數
HashValue* Hash_Remove(Hash* hash, HashKey* key, Hash_Compare* compare)
{HashValue* ret = NULL;HashNode* node = (HashNode*)BSTree_Delete(hash, key, compare);//從樹中刪除節點,并返回刪除節點if( node != NULL )//如果有該節點{ret = node->value;//取得節點內的值free(node);//釋放該節點}return ret;//返回值
}
//定義獲取值函數
HashValue* Hash_Get(Hash* hash, HashKey* key, Hash_Compare* compare)
{HashValue* ret = NULL;HashNode* node = (HashNode*)BSTree_Get(hash, key, compare);//從樹中獲取節點if( node != NULL )//如果有該節點{ret = node->value;//取得值}return ret;//返回值
}int Hash_Count(Hash* hash)//定義獲取數量函數
{return BSTree_Count(hash);
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "Hash.h"struct Student
{char* id;char* name;int age;
};int compare_id(HashKey* k1, HashKey* k2)//比較字符串
{return strcmp((char*)k1, (char*)k2);
}int main(int argc, char *argv[]) 
{Hash* hash = Hash_Create();struct Student s1 = {"9001201", "Delphi", 30};struct Student s2 = {"0xABCDE", "Java", 20};struct Student s3 = {"koabc", "C++", 40};struct Student s4 = {"!@#$%^", "C#", 10};struct Student s5 = {"Python", "Python", 10};struct Student* ps = NULL;Hash_Add(hash, s1.id, &s1, compare_id);Hash_Add(hash, s2.id, &s2, compare_id);Hash_Add(hash, s3.id, &s3, compare_id);Hash_Add(hash, s4.id, &s4, compare_id);Hash_Add(hash, s5.id, &s5, compare_id);ps = Hash_Get(hash, "koabc", compare_id);printf("ID: %s\n", ps->id);printf("Name: %s\n", ps->name);printf("Age: %d\n", ps->age);Hash_Destroy(hash);return 0;
}

分析:

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379127.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379127.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379127.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

scala spark 數據對比_IT大牛耗時三個月總結出大數據領域學習路線,網友評論:炸鍋了...

大數據不是某個專業或一門編程語言&#xff0c;實際上它是一系列技術的組合運用。有人通過下方的等式給出了大數據的定義。大數據 編程技巧 數據結構和算法 分析能力 數據庫技能 數學 機器學習 NLP OS 密碼學 并行編程雖然這個等式看起來很長&#xff0c;需要學習的東…

Java IdentityHashMap equals()方法與示例

IdentityHashMap類equals()方法 (IdentityHashMap Class equals() method) equals() method is available in java.util package. equals()方法在java.util包中可用。 equals() method is used to check whether this IdentityHashMap object and the given object (ob) are eq…

jQuery中關于Ajax的詳解

本文介紹如何使用jquery實現Ajax功能. 用于發送Ajax請求的相關函數如load, get, getJSON和post這些漸變Ajax方法, 對于核心的ajax 方法沒有過多介紹, 主要是通過配置復雜的參數實現完全控制Ajax請求。 Ajax讓用戶頁面豐富起來, 增強用戶體驗. Ajax是所有Web開發的必修課. 雖然A…

Python---實驗九作業

1&#xff0c;使用tkinter實現計算器程序。實現效果如下&#xff1a; from tkinter import * from tkinter.ttk import *def frame(master):"""將共同的屬性作為默認值, 以簡化Frame創建過程"""w Frame(master)w.pack(sideTOP, expandYES, fill…

分析FLV文件分析和解析器的開源代碼

分析一下GitHub上一份FLV文件分析和解析器的開源代碼 GitHub源碼地址&#xff1a;功能強大的 FLV 文件分析和解析器 &#xff1a;可以將flv文件的視頻tag中的h264類型數據和音頻tag中的aac類型數據導出 &#xff08;只限h264和aac&#xff09; (這個代碼不太適合用于大文件的分…

用pv操作描述如下前驅圖_LinkedList實現分析(二)——常用操作

上一篇文章LinkedList實現分析(一)——LinkedList初探與對象創建介紹了LinkedList中的一些重要屬性和構造方法&#xff0c;下面我們將詳細介紹一下LinkedList提高的常用方法的實現原理元素添加###add(E e)方法往LinkedList添加元素&#xff0c;LinkedList提供了多重方式&#x…

C++多重繼承與虛基類及與.NET的比較

多重繼承前面我們介紹的派生類只有一個基類&#xff0c;稱為單基派生或單一繼承。在實際運用中&#xff0c;我們經常需要派生類同時具有多個基類&#xff0c;這種方法稱為多基派生或多重繼承。2.1 多重繼承的聲明&#xff1a;在 C 中&#xff0c;聲明具有兩個以上基類的派生類與…

Javascript的IE和Firefox兼容性匯編

window.event現有問題&#xff1a;使用 window.event 無法在 FF 上運行解決方法&#xff1a;FF 的 event 只能在事件發生的現場使用&#xff0c;此問題暫無法解決。可以這樣變通&#xff1a;原代碼(可在IE中運行)&#xff1a;<input type"button" name"someB…

Java Double類compareTo()方法與示例

雙類compareTo()方法 (Double class compareTo() method) compareTo() method is available in java.lang package. compareTo()方法在java.lang包中可用。 compareTo() method is used to check equality or inequality for this Double-object against the given Double-obje…

平院實訓門禁系統導入

這是我的配置&#xff08;如果是Win10最好每一步都管理員身份運行&#xff09; win7 SQLServer2008 VS2012 切記&#xff1a;注意&#xff1a;當你SQLserver創建數據庫和VS連接數據庫的時候得用同一種方式&#xff0c;要么都用window&#xff08;主機名&#xff09;&#xff0…

ffmpeg 解碼音頻(aac、mp3)輸出pcm文件

ffmpeg 解碼音頻&#xff08;aac、mp3&#xff09;輸出pcm文件 播放pcm可以參考&#xff1a; ffplay -ar 48000 -ac 2 -f f32le out.pcm main.c #include <stdio.h> #include <stdlib.h> #include <string.h>#include <libavutil/frame.h> #include …

Jquery getJSON()

getJSON與aspx 準備工作 Customer類 public class Customer{public int Unid { get; set; }public string CustomerName { get; set; }public string Memo { get; set; }public string Other { get; set; }}&#xff08;一&#xff09;ashx Customer customer new Customer { …

北京中信銀行總行地址_中信銀行拉薩分行舉行“存款保險標識”啟用和存款保險條例宣傳活動...

11月NOV中信銀行拉薩分行舉行“存款保險標識”啟用和《存款保險條例》宣傳活動揭牌啟用儀式111月Jul根據人民銀行和總行關于“存款保險標識”啟用工作相關要求&#xff0c;分行行領導高度重視“存款保險標識”啟用和《存款保險條例》宣傳活動工作&#xff0c;按照統一工作部署、…

Java ClassLoader getPackage()方法與示例

ClassLoader類的getPackage()方法 (ClassLoader Class getPackage() method) getPackage() method is available in java.lang package. getPackage()方法在java.lang包中可用。 getPackage() method is used to return the package that has been defined in ClassLoader or t…

C---編寫程序:求出1~1000之間能被7或12整除,但不能同時被二者整除的所有整數,將結果保存在數組中,要求程序數據的輸入、計算和輸出均使用函數實現。

編寫程序&#xff1a;求出1~1000之間能被7或12整除&#xff0c;但不能同時被二者整除的所有整數&#xff0c;將結果保存在數組中&#xff0c;要求程序數據的輸入、計算和輸出均使用函數實現。 編程思路&#xff1a;分別編寫函數input()、cal()、output()實現數據的輸入、計算和…

報告稱我國成最大移民輸出國 將形成投資產業鏈(關注)

時代特有的現象&#xff0c;我們應該予以關注 “現在國內房價這么高&#xff0c;政策也看不清&#xff0c;還不如逢高賣掉之前買的幾套房子&#xff0c;一兩套房子的錢辦個投資移民&#xff0c;趁還年輕&#xff0c;拿到綠卡后享受一下美國本國待遇的高等教育了。”廣州&#x…

轉整型_156.Ruby烘焙大理石豆沙吐司解鎖大理石花紋整型

好看又好吃的大理石豆沙面包。紅豆餡均勻分布在松軟細膩的面包體里&#xff0c;手撕著吃&#xff0c;一層層的甜美與溫柔&#xff5e;關于吐司面包&#xff0c;我公眾號里寫過白吐司(基礎款牛奶吐司&#xff0c;超綿鮮奶油吐司)和全麥吐司(基礎款50%全麥吐司&#xff0c;經典燕…

ffmpeg 解碼視頻(h264、mpeg2)輸出yuv420p文件

ffmpeg 解碼視頻&#xff08;h264、mpeg2&#xff09;輸出yuv420p文件 播放yuv可以參考&#xff1a;ffplay -pixel_format yuv420p -video_size 768x320 -framerate 25 out.yuv main.c #include <stdio.h> #include <stdlib.h> #include <string.h>#includ…

VS2010 快捷鍵 (空格顯示 綠點, Tab 顯示箭頭)

VS2010 有用的快捷鍵 &#xff1a; Ctrl r, ctrl w, 切換空格示。 轉載于:https://www.cnblogs.com/fengye87626/archive/2012/11/21/2780716.html

C---編寫程序:實現一個隨堂測試,能進行加減乘除運算。要求如下:(1)隨機產生兩個1~10的正整數,在屏幕上輸出題目,如:5+3=?(2)學生輸入答案,程序檢查學生輸入答案是否正確,若正確,

編寫程序&#xff1a;實現一個隨堂測試&#xff0c;能進行加減乘除運算。要求如下&#xff1a; 1&#xff09;隨機產生兩個1~10的正整數&#xff0c;在屏幕上輸出題目&#xff0c;如&#xff1a;53&#xff1f; 2&#xff09;學生輸入答案&#xff0c;程序檢查學生輸入答案是…