c++Set-使用链表的数据结构
c++ Set - Data Structure using Linked List
Tm试图获得链表中两个集合的差
示例:
输入:
集合A:1-2-3-5
集合B:2-4-5
输出:
活接头:5-4-2-5-3-2-1
十字路口:5-2
差异:3-4-1(此处有问题)地雷输出差异:5-3-2-1
此代码位于"LinkedList.h"下
#include "Node.h"
#include <iostream>
using namespace std;
class LinkedList
{
public:
Node *head;
LinkedList()
{
head = NULL;
}
bool find(Node *value)
{
int cnt(0);
Node *iterator = head;
while(iterator != NULL)
{
if(value->data == iterator->data) return 1;
iterator = iterator->next;
}
return cnt;
}
void insertBeginning(int value)
{
Node *newNode = new Node;
newNode->data = value;
if(find(newNode) != 1)
{
Node *temp = head;
head = newNode;
newNode->next = temp;
}
}
void deleteBeginning()
{
if(head != NULL)
{
Node *temp = head->next;
head = temp;
}
}
void display()
{
Node *iterator = head;
while (iterator != NULL)
{
cout<<iterator->data<<" ->";
iterator = iterator->next;
}
cout<<" end";
}
bool isEmpty()
{
int c;
head == NULL ? c = 1: c = 0;
return c;
}
};
class Set:public LinkedList
{
public:
void Union(Set& myListA,Set& myListB)
{
for(Node* iterator1 = myListA.head; iterator1 != NULL; iterator1 = iterator1->next)
{
LinkedList::insertBeginning(iterator1->data);
}
for(Node* iterator2 = myListB.head; iterator2 != NULL; iterator2 = iterator2->next)
{
LinkedList::insertBeginning(iterator2->data);
}
}
void Intersection(Set& myListA, Set& myListB)
{
for(Node* iterator3 = myListA.head; iterator3 != NULL; iterator3 = iterator3->next)
{
//if(LinkedList::find(iterator3) != 1)
for(Node* iterator4 = myListB.head; iterator4 != NULL; iterator4 = iterator4->next)
{
//if(LinkedList::find(iterator4) != 1)
if( iterator3->data == iterator4->data )
{
LinkedList::insertBeginning(iterator4->data);
}
}
}
}
void Difference(Set& myListA, Set& myListB)
{
for(Node* iterator5 = myListA.head; iterator5 != NULL; iterator5 = iterator5->next)
{
for(Node* iterator6 = myListB.head; iterator6 != NULL; iterator6 = iterator6->next)
{
if (iterator6->data != iterator5->data && LinkedList::find(iterator5) != 1 && LinkedList::find(iterator6) != 1) {
LinkedList::insertBeginning(iterator5->data);
}
else {
continue;
}
}
}
}
};
这是在"Node.h"下
class Node
{
public:
int data;
Node *next;
};
Difference
的实现太复杂了:由于列表是排序的,所以只需要找到不匹配的元素。这需要一个循环,在每次迭代中移动
- 如果元素在两个集合中,即它不是差异的一部分,则两个迭代器
- 第一个列表的迭代器,在这种情况下,元素在第一个集合中,但不在第二个集合中
- 第二个列表的迭代器,在这种情况下,您有一个元素在第二个集合中,但不在第一个集合中
Intersection
的实现同样过于复杂,也只需要一个循环:在没有为Difference()
存储元素的情况下,它只存储公共值。最后,Union()
也太复杂了:它会在每次迭代中存储一个元素,要么是公共的,要么是跳过的,这取决于采用哪个分支。这也将产生正确的结果。
显然,你真正想要使用的是
std::set_intersection(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_intersection));
std::set_union(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_union));
std::set_symmetric_difference(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_difference));
假设您已经为列表和迭代器提供了一个标准接口。
这是你的答案,7年后的
void Difference(Set& ListA, Set& ListB)
{
for (member* i5 = ListA.head; i5 != NULL; i5 = i5->next)
{
for (member* i6 = ListB.head; i6 != NULL; i6 = i6->next)
{
if (i6->data != i5->data && ListA.find(i6) != 1 && ListB.find(i5) != 1) {
List::insert(i5->data);
List::insert(i6->data);
}
else {
continue;
}
}
}
}
相关文章:
- 链表,反向函数,数据结构
- 我对数据结构、双向链表有一些问题
- 使用带有链表的堆栈数据结构将中缀转换为后缀
- 使用链表数据结构打印多项式
- 使用 trie 数据结构链接不同类型的信息
- 如何通过不同的指针使用类的对象访问结构?(链表)(C++)
- 如何通过其持有的数据从链表中删除某个节点?
- 结构内具有更多数据类型的单个链表
- C++中的数据结构,插入链表中节点的开头
- C++ 访问数据的链表实现
- 数据类型为结构的链表
- C++排序结构链表
- C++内存从将数据插入链表中泄漏
- 链表数据结构
- 链表类,如何访问嵌套节点结构的数据
- 使用C++当我同时具有整数和字符数组时,如何将.txt文件中的数据作为链表的一部分访问
- c++Set-使用链表的数据结构
- 简单抽象数据类型链表
- 链表数据结构中的C++重载运算符>>
- 修改在其他结构(链表)中定义的结构对象的元素