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
原创粉丝点击