【文件系統—散列結構文件】

文章目錄

    • 一、實驗目的
      • 實驗內容
      • 設計思路
    • 三、實驗代碼實現
    • 四、總結

一、實驗目的

理解linux文件系統的內部技術,掌握linux與文件有關的系統調用命令,并在此基礎上建立面向隨機檢索的散列結構文件;## 二、實驗內容與設計思想

實驗內容

1.設計一組散列文件函數,包括散列文件的創建,打開,關閉,讀,寫等;
2.編寫一個測試程序,通過記錄保存,查找,刪除等操作,檢查上述散列文件是否實現相關功能;

設計思路

  1. 設計散列文件函數
    我設計了一組散列文件函數,涵蓋了散列文件的創建、打開、關閉、讀和寫等操作。這些函數是構建散列結構文件的基礎,通過合理的設計和實現,確保了文件操作的高效性和正確性。
  2. 編寫測試程序
    為了驗證散列文件的功能,我編寫了一個測試程序,通過記錄的保存、查找和刪除等操作,檢查散列文件是否能正常工作。這個測試程序就像是一個 “質檢員”,幫助我發現并解決代碼中可能存在的問題。

三、實驗代碼實現

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define HASH_TABLE_SIZE 10  // 散列表大小
#define MAX_RECORD_LENGTH 100 // 記錄最大長度typedef struct Record {char key[20];             // 記錄的關鍵字char data[MAX_RECORD_LENGTH]; // 記錄的數據struct Record* next;      // 鏈接到下一個記錄(用于處理沖突)
} Record;typedef struct HashTable {Record* table[HASH_TABLE_SIZE]; // 散列表
} HashTable;// 哈希函數
unsigned int hash(const char* key) {unsigned int hashValue = 0;while (*key) {hashValue = (hashValue << 5) + *key; // 左移 5 位并加上當前字符的 ASCII 值key++;}return hashValue % HASH_TABLE_SIZE;
}// 創建散列文件
HashTable* createHashTable() {HashTable* ht = (HashTable*)malloc(sizeof(HashTable));memset(ht, 0, sizeof(HashTable)); // 初始化散列表return ht;
}// 插入記錄
void insertRecord(HashTable* ht, const char* key, const char* data) {unsigned int index = hash(key);Record* newRecord = (Record*)malloc(sizeof(Record));strcpy(newRecord->key, key);strncpy(newRecord->data, data, MAX_RECORD_LENGTH);newRecord->next = ht->table[index]; // 插入鏈表的頭部ht->table[index] = newRecord;
}// 查找記錄
Record* findRecord(HashTable* ht, const char* key) {unsigned int index = hash(key);Record* record = ht->table[index];while (record != NULL) {if (strcmp(record->key, key) == 0) {return record; // 找到記錄}record = record->next;}return NULL; // 未找到記錄
}// 刪除記錄
void deleteRecord(HashTable* ht, const char* key) {unsigned int index = hash(key);Record* record = ht->table[index];Record* prev = NULL;while (record != NULL) {if (strcmp(record->key, key) == 0) {if (prev == NULL) {ht->table[index] = record->next; // 刪除鏈表頭部元素} else {prev->next = record->next; // 刪除中間或尾部元素}free(record); // 釋放內存return;}prev = record;record = record->next;}
}// 關閉散列文件(釋放內存)
void closeHashTable(HashTable* ht) {for (int i = 0; i < HASH_TABLE_SIZE; i++) {Record* record = ht->table[i];while (record != NULL) {Record* temp = record;record = record->next;free(temp); // 釋放每個記錄}}free(ht); // 釋放哈希表
}// 測試程序
int main() {HashTable* ht = createHashTable();// 插入記錄insertRecord(ht, "key1", "data1");insertRecord(ht, "key2", "data2");insertRecord(ht, "key3", "data3");// 查找記錄Record* found = findRecord(ht, "key2");if (found) {printf("找到記錄: %s -> %s\n", found->key, found->data);} else {printf("未找到記錄\n");}// 刪除記錄deleteRecord(ht, "key2");found = findRecord(ht, "key2");if (found) {printf("找到記錄: %s -> %s\n", found->key, found->data);} else {printf("未找到記錄\n");}// 關閉哈希表closeHashTable(ht);return 0;
}

結果:
在這里插入圖片描述

結果分析:

程序首先插入三條記錄:
key1 -> data1
key2 -> data2
key3 -> data3
當程序嘗試查找key2時,程序找到了該記錄,因此輸出:Found record: key2 -> data2
接下來,程序刪除了key2記錄。
再次查key2 時,記錄已經被刪除,因此輸出:Record not found

四、總結

  • 遇到的問題
    第一次運行時,我輸錯了編譯文件的名字,結果提示權限不夠。這讓我意識到在操作過程中一定要細心,一個小小的失誤都可能導致程序無法正常運行。經過修正后,程序的運行結果符合預期。程序先插入了三條記錄,然后成功查找到了 key2 對應的記錄,接著刪除了該記錄,再次查找時就顯示未找到記錄,這表明散列文件的基本功能已經實現。
    在這里插入圖片描述
    為了處理哈希沖突,我使用了鏈式法。通過鏈表存儲多個記錄,保證了散列表的完整性。這讓我認識到在設計數據結構時,不僅要考慮基本功能的實現,還要考慮可能出現的異常情況,并采取有效的處理方法。
    在實現散列表的過程中,我更加深入地理解了指針和內存管理的重要性。正確地分配和釋放內存是保證程序穩定運行的關鍵,稍有不慎就可能導致內存泄漏或懸空指針等問題。這也提醒我在今后的編程中要養成良好的內存管理習慣。

這次實驗讓我對 Linux 文件系統和散列結構文件有了更深入的理解,也提升了我的編程能力和問題解決能力。在今后的學習和工作中,我將繼續探索數據結構和算法的奧秘,不斷提升自己的技術水平。同時,我也會更加注重細節,避免因為粗心而導致的錯誤。我相信,通過不斷的實踐和學習,我能夠更好地應對各種編程挑戰。

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

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

相關文章

力扣26——刪除有序數組中的重復項

目錄 1.題目描述&#xff1a; 2.算法分析&#xff1a; 3.代碼展示&#xff1a; 1.題目描述&#xff1a; 給你一個 非嚴格遞增排列 的數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使每個元素 只出現一次 &#xff0c;返回刪除后數組的新長度。元素的 相對…

ggplot2 | GO barplot with gene list

1. 效果圖 2. 代碼 數據是GO的輸出結果&#xff0c;本文使用的是 metascape 輸出的excel挑選的若干行。 # 1. 讀取數據 datread.csv("E:\\research\\scPolyA-seq2\\GO-APA-Timepoint\\test.csv", sep"\t") head(dat)# 2. 選擇所需要的列 dat.usedat[, c(…

學習搭子,秘塔AI搜索

什么是秘塔AI搜索 《秘塔AI搜索》的網址&#xff1a;https://metaso.cn/ 功能&#xff1a;AI搜索和知識學習&#xff0c;其中學習部分是亮點&#xff0c;也是主要推薦理由。對應的入口&#xff1a;https://metaso.cn/study 推薦理由 界面細節做工精良《今天學點啥》板塊的知…

【C語言】--指針超詳解(三)

目錄 一.數組名的理解 二.使用指針訪問數組 三.一維數組傳參的本質 四.冒泡排序 五.二級指針 六.指針數組 6.1--指針數組的定義 6.2--指針數組模擬二維數組 &#x1f525;個人主頁&#xff1a;草莓熊Lotso的個人主頁 &#x1f3ac;作者簡介&#xff1a;C方向學習者 &…

Linux防火墻

1.防火墻是一種位于內部網絡與外部網絡之間的網絡安全系統&#xff0c;它依照特定的規則&#xff0c;允許或限制傳輸的數據通過&#xff0c;以保護內部網絡的安全。以下從功能、分類、工作原理等方面為你詳細講解&#xff1a; 功能訪問控制&#xff1a;這是防火墻最主要的功能。…

嵌入式培訓之C語言學習完(十七)結構體、共用體、枚舉、typedef關鍵字與位運算

目錄 一、結構體&#xff08;struct關鍵字&#xff09; &#xff08;一&#xff09;聲明一個結構體數據類型 &#xff08;二&#xff09;結構體的成員初始化與賦值 a、結構體變量賦值 b、結構體成員初始化 c、結構體的定義形式 &#xff08;三&#xff09;考點&#xff…

Python字典:數據操作的核心容器

在Python編程生態中&#xff0c;字典&#xff08;dict&#xff09;是最常用且功能強大的內置數據結構之一。它以鍵值對&#xff08;Key-Value Pair&#xff09;的形式存儲數據&#xff0c;為快速查找、靈活映射關系提供了天然支持。無論是數據清洗、算法實現還是Web開發&#x…

按位寬提取十六進制值

需求&#xff1a;給出一個十六進制值&#xff0c;要求提取high和low位之間的值。比如16ha0f0&#xff0c;這是一個16bit寬的十六進制數0xa0f0&#xff0c;提取[15:12]范圍內的值。 def extract_bits(value, high, low):"""從 value 中提取 [high:low] 位的值:p…

LeRobot 項目部署運行邏輯(六)——visualize_dataset_html.py/visualize_dataset.py

可視化腳本包括了兩個方法&#xff1a;遠程下載 huggingface 上的數據集和使用本地數據集 腳本主要使用兩個&#xff1a; 目前來說&#xff0c;ACT 采集訓練用的是統一時間長度的數據集&#xff0c;此外&#xff0c;這兩個腳本最大的問題在于不能裁剪&#xff0c;這也是比較好…

SSTI模版注入

1、概念 SSTI是一種常見的Web安全漏洞&#xff0c;它允許攻擊者通過注入惡意模板代碼&#xff0c;使服務器在渲染模板時執行非預期的操作。 &#xff08;1&#xff09;渲染模版 至于什么是渲染模版&#xff1a;服務器端渲染模板是一種Web開發技術&#xff0c;它允許在服務器端…

關于點膠機的精度

一、精度&#xff1a; 1:X/y軸定位精度常通在5個絲左右&#xff0c;Z軸在3個絲左右&#xff0c; 如果采用伺服電機絲桿配置&#xff0c;可提升至于個2絲左右。 2&#xff1a;膠水控制精度&#xff1a;通過噴閥驅動器&#xff0c;氣壓等參數&#xff0c;實現膠量控制&#xf…

gitee推送更新失敗問題記錄:remote: error: hook declined to update refs/heads/master

問題描述&#xff1a; gitee推送更新時&#xff0c;提示&#xff1a; 解決方法&#xff1a; 登錄Gitee&#xff0c;進入【個人主頁】 點擊【個人設置】 更改郵箱的配置&#xff0c;如下&#xff1a; 更改“禁止命令行推送暴露個人郵箱”&#xff0c;將其關閉&#xff1a;

Java如何獲取電腦分辨率?

以下是一個 Java 程序示例&#xff0c;用于獲取電腦的主屏幕分辨率&#xff1a; import java.awt.*; public class ScreenResolutionExample { public static void main(String[] args) { // 獲取默認的屏幕設備 GraphicsDevice device GraphicsEnvironm…

WPF 3D圖形編程核心技術解析

一、三維坐標系系統 WPF采用右手坐標系系統&#xff0c;空間定位遵循&#xff1a; X 軸 → 右 Y 軸 → 上 Z 軸 → 觀察方向 X軸 \rightarrow 右\quad Y軸 \rightarrow 上\quad Z軸 \rightarrow 觀察方向 X軸→右Y軸→上Z軸→觀察方向 三維坐標值表示為 ( x , y , z ) (x, y,…

【庫(Library)、包(Package)和模塊(Module)解析】

在Python中&#xff0c;**庫&#xff08;Library&#xff09;、包&#xff08;Package&#xff09;和模塊&#xff08;Module&#xff09;**是代碼組織的不同層級&#xff0c;而import語句的導入行為與它們密切相關。以下是詳細對比和解釋&#xff1a; &#x1f4e6; 1. 核心概…

裸機上的 printf:在無操作系統環境下構建 C 標準庫

在嵌入式開發和底層系統編程領域&#xff0c;裸機開發是一項極具挑戰性但又至關重要的任務。想象一下&#xff0c;在沒有操作系統支持的情況下&#xff0c;讓 C 語言的標準庫函數&#xff0c;如printf正常工作&#xff0c;這聽起來是不是很有趣又充滿挑戰&#xff1f;今天&…

基于STM32F103的智能機械臂識別與控制項目(課件PPT+源代碼)

以下是基于 STM32F103 的智能機械臂識別與控制項目的詳細介紹&#xff1a; 項目概述 該項目以 STM32F103 為核心控制器&#xff0c;結合多種傳感器和技術&#xff0c;實現了機械臂的智能識別與控制功能&#xff0c;可完成倉庫貨物的識別、搬運等任務&#xff0c;并支持多種控…

Codeforces Round 1023 (Div. 2)

Dashboard - Codeforces Round 1023 (Div. 2) - Codeforces 一個構造問題&#xff0c;我把最大的數放在一個數組&#xff0c;其余數放在另一個數組&#xff0c;就能保證gcd不同 來看代碼&#xff1a; #include <bits/stdc.h> using namespace std;int main() {int t;ci…

6.01 Python中打開usb相機并進行顯示

本案例介紹如何打開USB相機并每隔100ms進行刷新的代碼,效果如下: 一、主要思路: 1. 打開視頻流、讀取幀 self.cam_cap = cv2.VideoCapture(0) #打開 視頻流 cam_ret, cam_frame = self.cam_cap.read() //讀取幀。 2.使用定時器,每隔100ms讀取幀 3.顯示到Qt的QLabel…

JVM——即時編譯

分層編譯模式&#xff1a;動態平衡啟動速度與執行效率 分層編譯是現代JVM&#xff08;如HotSpot、GraalVM&#xff09;實現高性能的核心策略之一&#xff0c;其核心思想是根據代碼的執行熱度動態選擇不同的編譯層次&#xff0c;實現啟動速度與運行效率的最佳平衡。以HotSpot虛…