应用哈希表和双向链表实现下面功能:1.生成1GB的数据,表示朋友之间的人际关系,其中朋友的平均数量大于3,小于20。 2.搜索:输入一个人的名字(假设每个人都有一个唯一的名字),输出他/她的朋友名单。 3.添加:输入一个人的名字,如果这个人不存在,将这个人添加到网络中。输入几个朋友,如果不存在,将此关系添加到网络中。 4.删除:输入一个人的名字,删除这个人和他/她的所有关系。输入一对好友,删除他们之间的友情。 5.修改:修改一个人的属性。要c++代码

时间: 2024-02-27 20:52:47 浏览: 17
好的,下面是使用哈希表和双向链表实现这个问题的 C++ 代码。在代码中,我们使用了 STL 中的 unordered_map 作为哈希表的实现,使用了自定义的双向链表 FriendList 作为每个人的朋友名单: ```cpp #include <iostream> #include <string> #include <unordered_map> #include <list> using namespace std; // 双向链表节点,表示一个朋友 struct FriendNode { string name; // 朋友的名字 // 其他属性... FriendNode* prev; // 上一个节点指针 FriendNode* next; // 下一个节点指针 FriendNode(string name) { this->name = name; // 初始化其他属性... prev = nullptr; next = nullptr; } }; // 双向链表,表示一个人的朋友列表 class FriendList { private: FriendNode* head; // 头节点指针 FriendNode* tail; // 尾节点指针 public: FriendList() { head = nullptr; tail = nullptr; } // 添加一个朋友 void addFriend(string name) { FriendNode* node = new FriendNode(name); if (tail == nullptr) { head = node; tail = node; } else { tail->next = node; node->prev = tail; tail = node; } } // 删除一个朋友 void removeFriend(FriendNode* node) { if (node == nullptr) { return; } if (node == head && node == tail) { head = nullptr; tail = nullptr; } else if (node == head) { head = head->next; head->prev = nullptr; } else if (node == tail) { tail = tail->prev; tail->next = nullptr; } else { node->prev->next = node->next; node->next->prev = node->prev; } delete node; } // 查找一个朋友 FriendNode* findFriend(string name) { FriendNode* curr = head; while (curr != nullptr) { if (curr->name == name) { return curr; } curr = curr->next; } return nullptr; } // 输出所有朋友的名字 void printAllFriends() { FriendNode* curr = head; while (curr != nullptr) { cout << curr->name << " "; curr = curr->next; } cout << endl; } }; // 哈希表,表示整个人际关系网络 class FriendNetwork { private: unordered_map<string, FriendList*> network; // 哈希表,用于存储人际关系网络 public: // 析构函数,用于释放内存 ~FriendNetwork() { for (auto it = network.begin(); it != network.end(); ++it) { delete it->second; } } // 添加一个人和他的朋友关系 void addPerson(string name, vector<string> friends) { // 如果这个人已经存在,则直接添加朋友关系 if (network.find(name) != network.end()) { FriendList* friendList = network[name]; for (string friendName : friends) { FriendNode* friendNode = friendList->findFriend(friendName); if (friendNode == nullptr) { friendList->addFriend(friendName); } } return; } // 如果这个人不存在,则创建一个新的朋友列表,并添加朋友关系 FriendList* friendList = new FriendList(); for (string friendName : friends) { friendList->addFriend(friendName); } network[name] = friendList; } // 删除一个人和他的所有朋友关系 void removePerson(string name) { FriendList* friendList = network[name]; if (friendList == nullptr) { return; } // 删除这个人的所有朋友关系 FriendNode* curr = friendList->head; while (curr != nullptr) { FriendNode* next = curr->next; friendList->removeFriend(curr); curr = next; } // 删除这个人本身 network.erase(name); delete friendList; } // 删除两个朋友之间的关系 void removeFriendship(string name1, string name2) { FriendList* friendList1 = network[name1]; FriendNode* friendNode1 = friendList1->findFriend(name2); if (friendNode1 != nullptr) { friendList1->removeFriend(friendNode1); } FriendList* friendList2 = network[name2]; FriendNode* friendNode2 = friendList2->findFriend(name1); if (friendNode2 != nullptr) { friendList2->removeFriend(friendNode2); } } // 查找一个人的朋友列表 void findFriends(string name) { FriendList* friendList = network[name]; if (friendList == nullptr) { cout << "Person not found." << endl; return; } friendList->printAllFriends(); } // 修改一个人的朋友列表 void modifyFriends(string name, vector<string> friends) { FriendList* friendList = network[name]; if (friendList == nullptr) { return; } // 删除原有的朋友关系 FriendNode* curr = friendList->head; while (curr != nullptr) { FriendNode* next = curr->next; friendList->removeFriend(curr); curr = next; } // 添加新的朋友关系 for (string friendName : friends) { friendList->addFriend(friendName); } } }; int main() { FriendNetwork network; // 生成1GB的数据,添加到人际关系网络中 // ... // 搜索:输入一个人的名字,输出他/她的朋友名单 network.findFriends("Alice"); // 添加:输入一个人的名字,如果这个人不存在,将这个人添加到网络中。输入几个朋友,如果不存在,将此关系添加到网络中。 vector<string> aliceFriends = {"Bob", "Charlie", "Dave"}; network.addPerson("Alice", aliceFriends); // 删除:输入一个人的名字,删除这个人和他/她的所有关系。输入一对好友,删除他们之间的友情 network.removePerson("Bob"); network.removeFriendship("Alice", "Charlie"); // 修改:修改一个人的属性 vector<string> newAliceFriends = {"David", "Eva", "Frank"}; network.modifyFriends("Alice", newAliceFriends); return 0; } ``` 需要注意的是,在代码中并没有对生成1GB的数据进行具体实现,因为这部分需要根据具体情况来完成。另外,在实际应用中,还需要考虑如何对哈希表进行优化,以及如何处理哈希冲突等问题。

相关推荐

最新推荐

recommend-type

C语言基于哈希表实现通讯录

主要为大家详细介绍了C语言基于哈希表实现通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)

主要介绍了C#中哈希表(HashTable)用法,简单讲述了哈希表的原理并结合实例形式详细分析了C#针对哈希表进行添加、移除、判断、遍历、排序等操作的实现技巧,需要的朋友可以参考下
recommend-type

java数据结构与算法.pdf

包含了各种数据结构和算法(java)的实现方式和详解(图解),包括单双链表、环形链表(约瑟夫问题)、栈、后缀表达式、中缀表达式转后缀表达式、迷宫问题、八大排序算法、多种查找算法、哈希表、二叉树实现以及操作...
recommend-type

严蔚敏 数据结构 ppt 哈希表 数 图

严蔚敏 数据结构 ppt 哈希表 数 图 严蔚敏 数据结构 ppt 哈希表 数 图 严蔚敏 数据结构 ppt 哈希表 数 图
recommend-type

杂凑表的设计与实现 数据结构 哈希 hash

针对本班的人名设计一个杂凑表,数据表的长度为50~80个记录;分析平均查找长度,完成相应的建表和查表程序,设计直观的界面显示杂凑表的内容。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。