Set

class CSet { struct SqList{ int *elem; int length; int listsize; //}* L;//关键是这里,数据成员是一个顺序存储的线性表,一个表而已,不用指针 } L; public: CSet (); CSet (int *s,int l); CSet (const CSet &rhs); ~CSet (); bool Add (int x); bool Find (int x) const; bool Remove (int x); void Display () const; CSet Unoin (const CSet &rhs) const; CSet Join (const CSet &rhs) const; CSet Diff (const CSet &rhs) const; };

#include <iostream> using namespace std; #include "Set.h" const int MAX = 100; /* CSet::CSet() { L = new SqList; L->elem = new int[100]; L->length = 0; L->listsize = 100; } */ CSet::CSet() { //cout<<"Default Constructor"<<endl; L.elem = new int[MAX]; L.length = 0; L.listsize = MAX; } /* CSet::CSet(int *s, int l, int m) { int i = 0; L = new SqList; L ->elem = new int[m]; for(i=0; i<l;i++) this->Add(s[i]); L->elem = s; L->length = l; L->listsize = m; } */ CSet::CSet(int* s, int l) { int i = 0; L.elem = new int[MAX]; L.length = 0; L.listsize = MAX; for(i=0; i<l; ++i) { this->Add(s[i]); } } /* CSet::CSet (const CSet &rhs) { L = new SqList; struct SqList *r = L; int *p =rhs.L->elem; while (p) { int *s = new int; s = p; p++; r->elem = s; r->elem++; r->length++; } r->listsize = r->length; } */ //这个拷贝构造这里没用到,即使你把它注释掉也没关系; CSet::CSet(const CSet& rhs) { L.elem = new int[rhs.L.listsize]; L.length = rhs.L.length; L.listsize = rhs.L.listsize; int i=0; for(i=0; i<L.length; ++i) { L.elem[i] = rhs.L.elem[i]; } } /* CSet::~CSet() { if (L) { int *p = L->elem; delete[]p; L->listsize = L->length = 0; } delete L; } */ CSet::~CSet() { delete[] this->L.elem; } /* bool CSet::Add (int x) { if(L->length >= L->listsize) { int *newbase = new int [L->listsize+100]; if(!newbase)return false; L->elem = newbase; L->listsize += 100; } for(int i=0; i<L->length && L->elem[i] < x; i++); if(L->elem[i] == x || i>=L->length) return false; int *p = &L->elem[i]; for(int *q = &L->elem[L->length-1]; q>p; --q) *(q+1) = *q; *p = x; ++L->length; return true; } */ bool CSet::Add(int x) { int i = 0, j = 0; while(i<L.length && L.elem[i]<x) { ++i; } if(i<L.length && L.elem[i] == x) return false; else { for(j=L.length; j>i; --j) { L.elem[j] = L.elem[j-1]; } L.elem[i] = x; L.length ++; return true; } } /* bool CSet::Find (int x) const { for(int i=0; i<L->length && L->elem[i]< x; i++); if(i < L->length && L->elem[i] == x) return true; return false; } */ bool CSet::Find(int x) const { int i = 0; for(i=0; i<L.length && x >= L.elem[i]; ++i) { if(L.elem[i] == x) return true; } return false; } /* bool CSet::Remove (int x) { for(int i=0; i<L->length && L->elem[i]< x; i++); if(i < L->length && L->elem[i] == x) { int *p=&L->elem[i]; int *q = &L->elem[L->length-1]; for(++p; p<q; ++p) *(p-1) = *p; --L->elem; return true; } return false; } */ bool CSet::Remove(int x) { int i = 0, j = 0; for(i=0; i<L.length && x>= L.elem[i]; ++i) { if(x == L.elem[i]) { //把后面的元素一上来 for(; i<L.length-1; ++i) { L.elem[i] = L.elem[i+1]; } L.length --; return true; } } return false; } /* void CSet::Display()const { int i = 0; cout << "{"; if(L->length) { cout<<L->elem[0]; for(i=1; i<L->length; i++) cout<< ","<<L->elem[i]; } cout<<"}"<<endl; } */ void CSet::Display() const { int i = 0; cout<<"{"; if(L.length > 0) { cout<<L.elem[0]; for(i=1; i<L.length; ++i) { cout<<","<<L.elem[i]; } } cout<<"}"<<endl; } /* CSet CSet::Unoin (const CSet &rhs) const { CSet result; struct SqList *p,*q, *r; r = result.L; p = this->L; q = rhs.L; while (p->elem && q->elem) { int* s = NULL; if (*(p->elem) < *(q->elem)) { s = new int; *s = *(p->elem); p->elem++; } else if (*(p->elem) > *(q->elem)) { *s = *(p->elem); q->elem++; } else { *s = *(p->elem); p->elem++; q->elem++; } r->elem = s; r->elem++; r->length++; } while (p->elem) { int *s = new int; *s = *(p->elem); p->elem++; r->elem = s; r->elem++; r->length++; } while (q->elem) { int *s = new int; *s = *(q->elem); q->elem++; r->elem = s; r->elem++; r->length++; } return result; } */ CSet CSet::Unoin(const CSet & rhs) const { CSet result; int i = 0, j = 0, k = 0; while(i<this->L.length && j<rhs.L.length) { if(this->L.elem[i] < rhs.L.elem[j]) { result.L.elem[k++] = this->L.elem[i]; i++; } else if(this->L.elem[i] > rhs.L.elem[j]) { result.L.elem[k++] = rhs.L.elem[j]; j++; } else { result.L.elem[k++] = rhs.L.elem[j]; i++; j++; } } while(i<this->L.length) { result.L.elem[k++] = this->L.elem[i]; i++; } while(j<rhs.L.length) { result.L.elem[k++] = rhs.L.elem[j]; j++; } result.L.length = k; return result; } /* CSet CSet::Join (const CSet &rhs) const { CSet result; struct SqList *p,*q, *r; r = result.L; p = this->L; q = rhs.L; while (p->elem && q->elem) { if (*(p->elem) < *(q->elem)) { p->elem++; } else if (*(p->elem) > *(q->elem)) { q->elem++; } else { int *s = new int; *s = *(p->elem); p->elem++; q->elem++; r->elem = s; r->elem++; r->length++; } } return result; } */ CSet CSet::Join(const CSet & rhs) const { CSet result; int i = 0, j = 0, k = 0; while(i<this->L.length && j<rhs.L.length) { if(this->L.elem[i] < rhs.L.elem[j]) { i++; } else if(this->L.elem[i] > rhs.L.elem[j]) { j++; } else { result.L.elem[k++] = this->L.elem[i]; i++; j++; } } result.L.length = k; return result; } /* CSet CSet::Diff (const CSet &rhs) const { CSet result; struct SqList *p,*q, *r; r = result.L; p = this->L; q = rhs.L; while (p->elem && q->elem) { if (*(p->elem) < *(q->elem)) { int *s = new int; s = p->elem; p->elem++; r->elem = s; r->elem++; r->length++; } else if (*(p->elem) > *(q->elem)) { q->elem++; } else { p->elem++; q->elem++; } } while (p) { int *s = new int; s= p->elem; p->elem++; r->elem = s; r->elem++; r->length++; } return result; } */ CSet CSet::Diff(const CSet & rhs) const { CSet result; int i = 0, j =0, k = 0; while(i<this->L.length && j<rhs.L.length) { if(this->L.elem[i] < rhs.L.elem[j]) { result.L.elem[k++] = this->L.elem[i]; i++; } else if(this->L.elem[i] > rhs.L.elem[j]) { j++; } else { i++; j++; } } while(i<this->L.length) { result.L.elem[k++] = this->L.elem[i]; i++; } result.L.length = k; return result; }

#include <iostream> using namespace std; #include "set.h" const int MAX = 100; int main () { int S [] = {1,3,5,7,9}; CSet A ,B (S, sizeof (S) / sizeof (int)); while (1) { cout << "1. Add To A" << endl; cout << "2. Add To B" << endl; cout << "3. Display A" << endl; cout << "4. Display B" << endl; cout << "5. Locate in A" << endl; cout << "6. Remove from B" << endl; cout << "7. Union A B" << endl; cout << "8. Join A B" << endl; cout << "9. Diff A B" << endl; cout << "0. Exit" << endl; int choice; cin >> choice; if (choice == 0) break; int x; switch (choice) { case 1 : cin >> x; A.Add (x); break; case 2 : cin >> x; B.Add (x); break; case 3: A.Display (); break; case 4: B.Display (); break; case 5: cin >> x; if (A.Find (x)) { cout << "Found" << endl; } else { cout << "Not Found" << endl; } break; case 6 : cin >> x; B.Remove (x); break; case 7 : { CSet C = (A.Unoin (B)); C.Display (); } break; case 8 : { CSet C (A.Join (B)); C.Display (); } break; case 9 : { CSet C (A.Diff (B)); C.Display (); } break; } } //cout<<"end"<<endl; return 0; }//~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值