`

LinkedSet

GCC 
阅读更多
改了很久的bug
#ifndef LINKEDSET_H
#define LINKEDSET_H

#include<stdlib.h>
#include<iostream>
using namespace std;
template<typename T>
class SetNode{
public:
    T data;
    SetNode<T>* link;
    SetNode():link(NULL){
    }
    SetNode(const T& t,SetNode<T> *next=NULL):data(t),link(next){
    }
};

template<typename T>
class LinkedSet{
private:
    SetNode<T> *first,*last;
public:
    LinkedSet(){first=last=new SetNode<T>();}
    LinkedSet(LinkedSet<T>& R);
    ~LinkedSet(){
        makeEmpty();
        delete first;
    }
    void makeEmpty(){
        SetNode<T> *p = first->link;
        SetNode<T> *pre;
        while(p!=NULL){
            pre = p;
            delete pre;
            p = p->link;
        }
    }

    bool addMember(const T& x);
    bool delMember(const T& x);
    LinkedSet<T>& operator=(LinkedSet<T>& R);
    LinkedSet<T>& operator+(LinkedSet<T>& R);
    LinkedSet<T>& operator*(LinkedSet<T>& R);
    LinkedSet<T>& operator-(LinkedSet<T>& R);
    bool Contains(const T& x);
    bool operator==(LinkedSet<T>& R);
    friend ostream& operator<<(ostream& out,LinkedSet<T>& R){
        SetNode<T> *node = R.first->link;
        while(node!=NULL){
            out << node->data << " ";
            node = node->link;
        }
        out << endl;
        return out;
    }

    bool Min(T& x);
    bool Max(T& x);

};

template<typename T>
LinkedSet<T>::LinkedSet(LinkedSet<T> &R)
{
   SetNode<T> *src = R.first->link;
   first = last = new SetNode<T>;
   while(src!=NULL){
       last->link = new SetNode<T>(src->data);
       src = src->link;
       last = last->link;
   }
}

template<typename T>
bool LinkedSet<T>::Contains(const T &x)
{
    SetNode<T>* temp = first->link;
    while(temp!=NULL&&temp->data<x)
        temp = temp->link;
    if(temp!=NULL&&temp->data==x)
        return true;
    return false;
}

template<typename T>
bool LinkedSet<T>::addMember(const T &x)
{
    SetNode<T> *pre,*node;
    node = first->link;
    pre = first;
    while(node!=NULL&&node->data<x){
        pre = node;
        node = node->link;
    }
    if(node!=NULL&&node->data==x){
        return false;
    }else{
        SetNode<T>* s = new SetNode<T>(x);
        s->link = node;
        pre->link = s;
        if(node==NULL)
            last=s;
    }
    return true;
}

template<typename T>
bool LinkedSet<T>::delMember(const T &x)
{
    SetNode<T> *pre,*node;
    node = first->link;
    while(node!=NULL&&node->data!=x){
        pre = node;
        node = node->link;
    }
    if(node==NULL)//没找到
        return false;
    pre->link = node->link;
    if(node==last)
        last = pre;
    delete node;
    return true;
}

template<typename T>
LinkedSet<T>& LinkedSet<T>::operator=(LinkedSet<T>& R)
{
    SetNode<T> *p = R.first->link;
    SetNode<T> *node = first = new SetNode<T>;
    while(p!=NULL){
        node->link = new SetNode<T>(p->data);
        p = p->link;
        node = node->link;
    }
    node->link = NULL;
    last = node;
    return *this;
}

/*
  将集合this与集合R的并积,将计算结果放入temp中返回
  */
template<typename T>
LinkedSet<T>& LinkedSet<T>::operator+(LinkedSet<T>& R)
{
    SetNode<T> *pa = first->link;
    SetNode<T> *pb = R.first->link;
    //LinkedSet<T> temp我之前这么写总是有问题在这个函数里是对的,然后跑出去的返回
    //值就是脏数据,换成指针后好了,*,-也是这种情况,这是为什么呢?(平台g++)
    LinkedSet<T> *temp = new LinkedSet<T>;
    SetNode<T> *pc = temp->first;
    while(pa!=NULL&&pb!=NULL){
        if(pa->data==pb->data){
            pc->link = new SetNode<T>(pa->data);
            pa = pa->link;
            pb = pb->link;
        }else if(pa->data<pb->data){
            pc->link = new SetNode<T>(pa->data);
            pa = pa->link;
        }else{
            pc->link = new SetNode<T>(pb->data);
            pb = pb->link;
        }
        pc = pc->link;
    }
    while(pa!=NULL){
        pc->link = new SetNode<T>(pa->data);
        pc = pc->link;
        pa = pa->link;
    }
    while(pb!=NULL){
        pc->link = new SetNode<T>(pb->data);
        pc = pc->link;
        pb = pb->link;
    }
    pc->link = NULL;
    temp->last = pc;
    return *temp;
}

template<typename T>
LinkedSet<T>& LinkedSet<T>::operator*(LinkedSet<T>& R)
{
    SetNode<T> *pa = first->link;
    SetNode<T> *pb = R.first->link;
    LinkedSet<T> *temp = new LinkedSet<T>;
    SetNode<T> *pc = temp->first;
    while(pa!=NULL&&pb!=NULL){
        if(pa->data==pb->data){
            pc->link = new SetNode<T>(pa->data);
            pa = pa->link;
            pb = pb->link;
            pc = pc->link;
        }else{
            if(pa->data<pb->data){
                pa = pa->link;
            }else{
                pb = pb->link;
            }
        }
    }
    temp->last = pc;
    pc->link = NULL;
    return *temp;
}

template<typename T>
LinkedSet<T>& LinkedSet<T>::operator-(LinkedSet<T>& R)
{
    SetNode<T> *pa = first->link;
    SetNode<T> *pb = R.first->link;
    LinkedSet<T> *temp = new LinkedSet<T>;
    SetNode<T> *pc = temp->first;
    while(pa!=NULL&&pb!=NULL){
        if(pa->data==pb->data){
            pb = pb->link;
            pa = pa->link;
        }else if(pa->data<pb->data){
            pc->link = new SetNode<T>(pa->data);
            pa = pa->link;
            pc = pc->link;
        }else{
            pb = pb->link;
        }
    }
    while(pa!=NULL){
        pc->link = new SetNode<T>(pa->data);
        pa = pa->link;
        pc = pc->link;
    }
    pc->link = NULL;
    temp->last = pc;
    return *temp;
}

template<typename T>
bool LinkedSet<T>::operator==(LinkedSet<T>& R)
{
    SetNode<T> *pa = first->link;
    SetNode<T> *pb = R.first->link;
    bool equal = true;
    while(pa!=NULL&&pb!=NULL){
        if(pa->data!=pb->data){
            equal = false;
            break;
        }
        pa = pa->link;
        pb = pb->link;
    }
    if(pa!=NULL||pa!=NULL){
        equal = false;
    }
    return equal;
}

#endif // LINKEDSET_H

#include"linkedSet.h"
#include<iostream>
using namespace std;

int main()
{
    LinkedSet<int> ls1,ls2;
    for(int i=0;i<10;i++){
        ls1.addMember(i);
        if(i%2==0)
            ls2.addMember(i);
    }
    LinkedSet<int> ls3=ls1+ls2;
    cout << ls3;
    ls3 = ls1*ls2;
    cout << ls3;
    ls3 = ls1-ls2;
    cout << ls3;

}

0 1 2 3 4 5 6 7 8 9 
0 2 4 6 8 
1 3 5 7 9 
分享到:
评论

相关推荐

    java常用API举例

    LinkedHashSet&lt;String&gt; linkedSet = new LinkedHashSet(); linkedSet.add("Element3"); linkedSet.add("Element4"); for (String element : linkedSet) { System.out.println(element); // 按插入顺序输出 } ``` 8...

    HashSet去重

    - **`HashSet`与`ArraySet`/`LinkedSet`**:`HashSet`是基于哈希表实现的,而`ArraySet`通常是指数组实现的集合,`LinkedSet`则是基于链表实现的有序集合。`HashSet`提供了非常高效的增删查操作,但不保证元素的插入...

    hql增删改查

    - `LinkedSet`: 保留元素的添加顺序,同时不允许重复元素。 以上就是基于所提供的信息所整理出的HQL增删改查相关的核心知识点。希望这些内容能帮助您更好地理解和应用Hibernate框架中的HQL查询语言。

    set:使用LinkedHashMap在Go(Golang)中简单的Set数据结构实现

    组 Set是使用LinkedHashMap在Go(Golang)中简单的Set数据结构实现。 该库允许您获取一组int64或string而没有重复的项目。 用法 package main import ( "fmt" ... duplicatedInt64 := [] int64 { 1 , 1 , 2 , 2 , 3 ...

    2种Java删除ArrayList中的重复元素的方法

    LinkedHashSet&lt;String&gt; linkedSet = new LinkedHashSet(listWithDuplicateElements); ArrayList&lt;String&gt; listWithoutDuplicateElements = new ArrayList(linkedSet); // 打印删除重复元素后的ArrayList System....

    Gnubert Peer to Peer Evolution-开源

    8. LinkedSet.class:可能是一个自定义的链表集合类,用于存储和操作数据。 9. Cartesian.class:可能涉及到笛卡尔积运算,用于生成问题的解决方案空间。 10. hosts:这个文件可能包含已知主机的列表或配置信息。 ...

Global site tag (gtag.js) - Google Analytics