MOOC清华《程序设计基础》第8章:以文本文件存储链表
来源:互联网 发布:java调用golang 编辑:程序博客网 时间:2024/06/06 04:55
代码一:
#include <iostream>#include <fstream>#include <cstring>using namespace std;struct Time_t //定义结构体 {int year, month, day;int hour, minute, second;};struct Node //定义链表结点 {Time_t tm;char id[20];char op[10]; //以上三行为数据域 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.id);//添加新节点到链表头(成为新的头结点) Node* data = new Node;*data = elem;data->next = hash_tab[idx];hash_tab[idx] = data; }void Output(Node* hash_tab[], const char* filename){ofstream fout(filename);for(int i = 0; i < 256; i++){if(hash_tab[i] == NULL) continue;fout << i << ": " << endl;while(hash_tab[i]) { fout << hash_tab[i]->tm.year << '/' << hash_tab[i]->tm.month << '/' << hash_tab[i]->tm.day << ' ';fout << hash_tab[i]->tm.hour << '/' << hash_tab[i]->tm.minute << '/' << hash_tab[i]->tm.second << ' '; fout << hash_tab[i]->id << ' ';fout << hash_tab[i]->op << endl;hash_tab[i] = hash_tab[i]->next; } fout << endl << endl;}fout.close(); }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;}}int main(){Node* list_tab[256] = {NULL};ifstream fin("log.txt");while(!fin.eof()){char tmp;Node data;//读入一行数据fin >> data.tm.year >> tmp >> data.tm.month >> tmp >> data.tm.day;fin >> data.tm.hour >> tmp >> data.tm.minute >> tmp >> data.tm.second;fin >> data.id;fin >> data.op;//添加至哈希链表Insert(list_tab, data); }fin.close();//输出哈希表内容Output(list_tab, "hash3.txt");//释放哈希表内存Release(list_tab);return 0; }
代码二:
#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 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);for(int i = 0; i < 256; i++){Node* p = hash_tab[i];if(p == NULL) continue;fout << i << ": " << endl;while(p){fout << p->log.tm.year << '/' << p->log.tm.month << '/' << p->log.tm.day << ' ';fout << p->log.tm.hour << '/' << p->log.tm.minute << '/' << p->log.tm.second << ' ';fout << p->log.id << ' ';fout << p->log.op << endl;p = p->next;}fout << endl << endl;}fout.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();//保存哈希表内容到文件中SaveHashTab(list_tab, "hash2.txt"); //释放哈希表内存Release(list_tab);return 0; }
由上可见:两份代码的输出结果是一模一样的。
结合输出文件中的信息和前几篇相关博文中的信息来看,输出到文件的哈希表与输出到控制台的哈希表,其中每一个哈希值对应的小链表中的数据顺序是相反的!为什么会这样呢?
阅读全文
0 0
- 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清华《程序设计基础》第8章:二进制文件的数据存取
- MOOC清华《程序设计基础》第1章第1题:三角形求面积
- MOOC清华《程序设计基础》第1章第2题:求周长
- MOOC清华《程序设计基础》第1章第3题:求平方和
- MOOC清华《程序设计基础》第1章第4题:求解方程
- CentOS 6.5上安装JIRA 6.3.6
- db2常用命令大全 db2数据库中的操作命令
- 如何实现Springboot+mybaitis动态查询与关联查询?
- python连接远程MySQL数据库
- java 正则表达式
- MOOC清华《程序设计基础》第8章:以文本文件存储链表
- android 打包混淆
- 微信小程序之类似电影影评小程序
- Yougth的最大化
- C#组件开发(2),添加属性和事件
- P1162 填涂颜色
- python djiango框架中定制表格(前端显示含下载按钮)
- Java中的equals和hashCode方法详解
- 分布式通讯-序列化