MOOC清华《程序设计基础》第8章:以二进制文件存储链表
来源:互联网 发布:程序员之死 事件女方 编辑:程序博客网 时间:2024/05/26 09:57
#include <iostream>#include <fstream>#include <cstring>using namespace std;struct Time_t //时间类型的结构定义 {int year, month, day;int hour, minute, second;};struct Log_info //每个学生的记录信息{Time_t tm;char id[20];char op[20];}; struct Node //定义链表结点 {Log_info log; //数据域 Node* next; //指针域 };int Hash(const char* str) {int sum = 0;for(int i = 0; i < strlen(str); i++)sum ^= str[i];return sum;}void Insert(Node* hash_tab[], Node elem){//计算用户编号的哈希值int idx = Hash(elem.log.id);//添加新节点到链表头(成为新的头结点) Node* data = new Node;*data = elem;data->next = hash_tab[idx];hash_tab[idx] = data; }void Print(Node* list){while(list) { cout << list->log.tm.year << '/' << list->log.tm.month << '/' << list->log.tm.day << ' ';cout << list->log.tm.hour << '/' << list->log.tm.minute << '/' << list->log.tm.second << ' '; cout << list->log.id << ' ';cout << list->log.op << endl;list = list->next; } }void Output(Node* hash_tab[]){for(int i = 0; i < 256; i++){if(hash_tab[i] == NULL) continue;cout << i << ": ";Print(hash_tab[i]);cout << endl << endl;}}void Delete(Node* list){while(list){Node* tmp = list;list = list->next;delete tmp;}}void Release(Node* hash_tab[]){for(int i = 0; i < 256; i++){if(hash_tab[i] == NULL)continue;Delete(hash_tab[i]);hash_tab[i] = NULL;}}void SaveHashTab(Node* hash_tab[], const char* filename){ofstream fout(filename, ios::binary);for(int i = 0; i < 256; i++){Node* p = hash_tab[i];while(p){fout.write((char*) &(p->log), sizeof(p->log));p = p->next;}}fout.close();}void LoadHashTab(Node* hash_tab[], const char* filename){ifstream fin(filename, ios::binary);while(fin){Node data;fin.read((char*) &(data.log), sizeof(data.log));if(fin.eof())break;Insert(hash_tab, data);}fin.close();}int main(){Node* list_tab[256] = {NULL};ifstream fin("log.txt");while(!fin.eof()){char tmp;Node data;//读入一行数据fin >> data.log.tm.year >> tmp >> data.log.tm.month >> tmp >> data.log.tm.day;fin >> data.log.tm.hour >> tmp >> data.log.tm.minute >> tmp >> data.log.tm.second;fin >> data.log.id;fin >> data.log.op;//添加至哈希链表Insert(list_tab, data); }fin.close();//输出哈希表内容Output(list_tab);//保存哈希表内容到文件中SaveHashTab(list_tab, "list.tab"); //“list.tab”就是一个二进制文件 //释放哈希表内存Release(list_tab);//从文件中读入哈希表内容 LoadHashTab(list_tab, "list.tab");//输出哈希表内容Output(list_tab);//释放哈希表内存Release(list_tab); return 0; }
控制台窗口显示的内容如下(摘录)。根据运行时间的长度,可以大致判断出控制台窗口其实输出了两遍。一遍是直接从源程序构建的哈希表中输出的,另一遍是从保存到二进制文件中的哈希表输出的。
然后可执行程序所在根目录下出现了一个“list.tab”的二进制文件,将其扩展名修改为txt后,打开显示如下:
由此启发,可修改源代码,将输出的内容输出到文本文件中。
阅读全文
0 0
- MOOC清华《程序设计基础》第8章:以二进制文件存储链表
- MOOC清华《程序设计基础》第8章:以文本文件存储链表
- MOOC清华《程序设计基础》第8章:二进制文件的数据存取
- MOOC清华《程序设计基础》第8章:链表的基本概念
- MOOC清华《程序设计基础》第8章:链表的基本操作
- MOOC清华《程序设计基础》第8章第1题:代码补全-输出链表的奇数值项
- MOOC清华《程序设计基础》第4章:筛法求素数
- MOOC清华《程序设计基础》第4章:筛法数人数
- MOOC清华《程序设计基础》第5章:归并排序
- MOOC清华《程序设计基础》第5章:青蛙过河问题
- MOOC清华《程序设计基础》第7章:读文件操作
- MOOC清华《程序设计基础》第7章:统计活跃用户数
- MOOC清华《程序设计基础》第8章第2题:从文件读取二进制、按位异或
- MOOC清华《程序设计基础》第8章:哈希算法与哈希链表
- MOOC清华《程序设计基础》第1章第1题:三角形求面积
- MOOC清华《程序设计基础》第1章第2题:求周长
- MOOC清华《程序设计基础》第1章第3题:求平方和
- MOOC清华《程序设计基础》第1章第4题:求解方程
- mysql 5.7以上版本下载及安装
- JS生成UUID的方法实例
- gnome登录界面无法登录
- UI04-UIImageView图片组件
- laravel excel 判断带 各种页面提示参数
- MOOC清华《程序设计基础》第8章:以二进制文件存储链表
- sublime插件Emmet的使用
- C# 正则表达式实现字符串搜索
- Button margin:auto 不居中
- A*搜索简介
- 【POJ 1611】 The Suspects(并查集练习)
- 2017.08.02小结
- samsung 7420 在UFS烧录系统流程(ufs不存在)
- 各领域公开数据集下载 | 资源