本片对于数据结构自行设计的ADT,以及常用的算法、性质做一个记录。
顺序表
const int MAXLISTSIZE = 100; template<class ElemType> class SqList{ private: ElemType *elem; int length; int listsize; public: SqList(int ms = MAXLISTSIZE) { elem = new ElemType[ms]; length = 0; listsize = ms; } ~SqList(){delete [] elem;} void ListClear( ) { delete [] elem; elem = new ElemType[length]; length = 0;} int ListLength() const {return length;} bool SetListLength(int len) { if(len <= listsize && len >= length) { length = len; return 1; } ElemType *t; t = new ElemType[len]; for(int i = 0; i < min(length,len); ++i) t[i] = elem[i]; length = len; delete [] elem; elem = t; return 1; } bool ListEmpty() const { return !length; } bool ListFull() const { return listsize == length ? 1 : 0; } ElemType GetElem(int i) const { return elem[i]; } int GetElemIndex(ElemType e) const { for(int i = 0; i < length; i++) { if(elem[i] == e) return i; } return -1; } bool SetElem(int i, ElemType e) { if(i < 0 || i >= length) return 0; elem[i-1] = e; return 1; } bool ListInsert(ElemType e, int pos) { if(pos < 0 || pos > length) return 0; if(listsize - length > 0) { for(int i = length; i >= pos; i--) { elem[i] = elem[i-1]; } elem[pos] = e; length ++; }else { ElemType *t; length ++; t = new ElemType[length]; for(int i = 0; i < length; ++i) t[i] = elem[i]; delete [] elem; elem = t; for(int i = length; i > pos; i--) elem[i] = elem[i-1]; elem[pos] = e; } return 1; } bool Push(ElemType e) { if(listsize - length > 0) { elem[length] = e; length ++; }else { ElemType *t; length ++; t = new ElemType[length]; for(int i = 0; i < length; ++i) t[i] = elem[i]; delete [] elem; elem = t; elem[length-1] = e; } return 1; } void Pop() { if(length > 0) length --; } bool ListDelete(int pos) { if(pos < 0 || pos > length) return 0; if(length > 0) length--; else return 0; for(int i = pos; i < length; ++i) elem[i] = elem[i+1]; return 1; } bool compare(ElemType a, ElemType *b) { return a == *b; } int LocateElem(ElemType e) { for(int i = 0; i < length; ++i) { if(elem[i] = e) return i; } return -1; } bool PriorElem(ElemType cur_e, ElemType &pri_e) { for(int i = 0; i < length; i++) { if(elem[i] == cur_e) { if(i > 0) { pri_e = elem[i-1]; return 1; }else { return 0; } } } return 0; } bool NextElem(ElemType cur_e, ElemType &nex_e) { for(int i = 0; i < length; i++) { if(elem[i] == cur_e) { if(i < length-1) { nex_e = elem[i+1]; return 1; }else { return 0; } } } return 0; } void MoveForward() { ElemType t = elem[0]; for(int i = 0; i < length-1; i++) elem[i] = elem[i+1]; elem[length - 1] = t; } void Print() { if(length == 0) { cout<<"NULL"<<endl; return; } for(int i = 0; i < length; ++i) { cout<<elem[i]; if(i < length - 1) cout<<','; } cout<<endl; } void ListDestroy() { delete [] elem; elem = NULL; length = 0; listsize = 0; } };
|
链表
单链表
template<class ElemType> struct LinkNode { ElemType data; LinkNode<ElemType> *next; LinkNode(LinkNode<ElemType> *ptr = NULL){next = ptr;} LinkNode(const ElemType &item, LinkNode<ElemType> *ptr = NULL) { next = ptr; data = item; } };
template<class ElemType> class LinkList { private: LinkNode<ElemType> *head; LinkNode<ElemType> *tail; public: LinkList(){head = new LinkNode<ElemType>; tail = head;} LinkList(const ElemType &item){head = new LinkNode<ElemType>(item); tail = head;} LinkList(LinkList<ElemType> &List); ~LinkList(){ListDestroy();} LinkList<ElemType>& operator=(LinkList<ElemType> &List); void ListDestroy(); void ListClear(); int ListLength() const; bool ListEmpty() const; bool InsFirst(ElemType e); bool InsEnd(ElemType e); LinkNode<ElemType>* GetHead() const{return head;} LinkNode<ElemType>* GetTail() const{return tail;} void SetHead(LinkNode<ElemType> *p); void SetTail(LinkNode<ElemType> *p); ElemType GetElem(int pos); bool ListInsert(int pos,ElemType e); bool DelFirst(); void CreateList_Head(int n, ElemType *A); void CreateList_Tail(int n, ElemType *A); ElemType ListDelete(int pos); bool compare(const LinkList<ElemType> &b); bool LocateElem(const ElemType &e, LinkNode<ElemType> *pos); bool NextElem(LinkNode<ElemType> *p, ElemType &e); bool ListTraverse() const; };
template<class ElemType> LinkList<ElemType>::LinkList(LinkList<ElemType> &List){ this->head = new LinkNode<ElemType>(List.head->data); LinkNode<ElemType> *p1 = this->head,*p2 = List.head; while(p2->next) { p1->next = new LinkNode<ElemType>(p2->next->data); p1 = p1->next; p2 = p2->next; } this->tail = p1; }
template<class ElemType> void LinkList<ElemType>::ListDestroy() { LinkNode<ElemType> *p = head, *t = p->next; while(p) { delete p; p = t; if(p) t = p->next; } }
template<class ElemType> LinkList<ElemType>& LinkList<ElemType>::operator=(LinkList<ElemType> &List) { this->head = new LinkNode<ElemType>(List.head->data); LinkNode<ElemType> *p1 = this->head,*p2 = List.head; while(p2->next) { p1->next = new LinkNode<ElemType>(p2->next->data); p1 = p1->next; p2 = p2->next; } tail = p1; return *this; }
template<class ElemType> void LinkList<ElemType>::ListClear() { ListDestroy(head->next); tail = head; }
template<class ElemType> int LinkList<ElemType>::ListLength() const { int length = 0; LinkNode<ElemType> *p = head; while(p->next) { p = p->next; length++; } return length; }
template<class ElemType> bool LinkList<ElemType>::ListEmpty() const { return head->next; }
template<class ElemType> bool LinkList<ElemType>::InsFirst(ElemType e) { LinkNode<ElemType> *t = new LinkNode<ElemType>(e); t->next = head->next; head->next = t; return true; }
template<class ElemType> bool LinkList<ElemType>::InsEnd(ElemType e) { LinkNode<ElemType> *t = new LinkNode<ElemType>(e); tail->next = t; tail = t; return true; }
template<class ElemType> void LinkList<ElemType>::SetHead(LinkNode<ElemType> *p) { head = p; }
template<class ElemType> void LinkList<ElemType>::SetTail(LinkNode<ElemType> *p) { tail = p; }
template<class ElemType> ElemType LinkList<ElemType>::GetElem(int pos) { if(pos < 1) return head->data; int num = 0; LinkNode<ElemType> *p = head; while(p->next) { num++; p = p->next; if(num == pos) return p->data; } return head->data; }
template<class ElemType> bool LinkList<ElemType>::ListInsert(int pos,ElemType e) { if(pos < 1) return false; int num = 0; LinkNode<ElemType> *p = head; LinkNode<ElemType> *t = new LinkNode<ElemType>(e); while(p->next) {
num++; if(num == pos) { t->next = p->next; p->next = t; return true; } p = p->next; } return false; }
template<class ElemType> bool LinkList<ElemType>::DelFirst() { if(!(head->next)) return false; LinkNode<ElemType> *t = head->next; head->next = t->next; delete t; if(!head->next) tail = head; return true; }
template<class ElemType> void LinkList<ElemType>::CreateList_Head(int n, ElemType *A) { int m = n; while(n) { InsFirst(*(A+(m-n))); n--; } }
template<class ElemType> void LinkList<ElemType>::CreateList_Tail(int n, ElemType *A) { int m = n; while(n) { InsEnd(*(A+(m-n))); n--; } }
template<class ElemType> ElemType LinkList<ElemType>::ListDelete(int pos) { LinkNode<ElemType> *p = head, *t; while(--pos) p = p->next; t = p->next; p->next = t->next; if(!p->next) tail = p; ElemType res = t->data; delete t; return res; }
template<class ElemType> bool LinkList<ElemType>::compare(const LinkList<ElemType> &b) { LinkNode<ElemType> *t = b.GetHead(), *p = head; while(p->next || t->next) { if(p->next->data != t->next->data) return false; p = p->next; t = t->next; } return true; }
template<class ElemType> bool LinkList<ElemType>::NextElem(LinkNode<ElemType> *p, ElemType &e) { if(p->next) e = p->next->data; else return false; return true; }
template<class ElemType> bool LinkList<ElemType>::ListTraverse() const { LinkNode<ElemType> *p = head; while(p->next) { p = p->next; cout<<p->data; if(p->next) cout<<"->"; } cout<<endl; return 1; }
|
循环链表
template<class ElemType> struct LinkNode { ElemType data,num; LinkNode<ElemType> *next; LinkNode(LinkNode<ElemType> *ptr = NULL){next = ptr;} LinkNode(const ElemType &item, LinkNode<ElemType> *ptr = NULL) { next = ptr; data = item; num = 0; } };
template<class ElemType> class LinkList { private: LinkNode<ElemType> *head; LinkNode<ElemType> *tail; public: LinkList(){head = new LinkNode<ElemType>; tail = head;} LinkList(const ElemType &item){head = new LinkNode<ElemType>(item); tail = head;} LinkList(LinkList<ElemType> &List); ~LinkList(){ListDestroy();} LinkList<ElemType>& operator=(LinkList<ElemType> &List); void ListDestroy(); void ListClear(); int ListLength() const; bool ListEmpty() const; bool InsFirst(ElemType e); bool InsEnd(ElemType e); LinkNode<ElemType>* GetHead() const{return head;} LinkNode<ElemType>* GetTail() const{return tail;} void SetHead(LinkNode<ElemType> *p); void SetTail(LinkNode<ElemType> *p); ElemType GetElem(int pos); bool ListInsert(int pos,ElemType e); bool DelFirst(); void CreateList_Head(int n, ElemType *A); void CreateList_Tail(int n, ElemType *A); ElemType ListDelete(int pos); bool compare(const LinkList<ElemType> &b); bool LocateElem(const ElemType &e, LinkNode<ElemType> *pos); bool NextElem(LinkNode<ElemType> *p, ElemType &e); bool ListTraverse() const; };
template<class ElemType> LinkList<ElemType>::LinkList(LinkList<ElemType> &List){ this->head = new LinkNode<ElemType>(List.head->data); LinkNode<ElemType> *p1 = this->head,*p2 = List.head; while(p2->next) { p1->next = new LinkNode<ElemType>(p2->next->data); p1 = p1->next; p2 = p2->next; } this->tail = p1; }
template<class ElemType> void LinkList<ElemType>::ListDestroy() { LinkNode<ElemType> *p = head, *t = p->next; while(p!=head) { delete p; p = t; if(p) t = p->next; } }
template<class ElemType> LinkList<ElemType>& LinkList<ElemType>::operator=(LinkList<ElemType> &List) { this->head = new LinkNode<ElemType>(List.head->data); LinkNode<ElemType> *p1 = this->head,*p2 = List.head; while(p2->next) { p1->next = new LinkNode<ElemType>(p2->next->data); p1 = p1->next; p2 = p2->next; } tail = p1; return *this; }
template<class ElemType> void LinkList<ElemType>::ListClear() { ListDestroy(head->next); tail = head; }
template<class ElemType> int LinkList<ElemType>::ListLength() const { int length = 0; LinkNode<ElemType> *p = head; while(p->next) { p = p->next; length++; } return length; }
template<class ElemType> bool LinkList<ElemType>::ListEmpty() const { return head->next; }
template<class ElemType> bool LinkList<ElemType>::InsFirst(ElemType e) { LinkNode<ElemType> *t = new LinkNode<ElemType>(e); t->next = head->next; head->next = t; return true; }
template<class ElemType> bool LinkList<ElemType>::InsEnd(ElemType e) { LinkNode<ElemType> *t = new LinkNode<ElemType>(e); tail->next = t; tail = t; tail->next = head; return true; }
template<class ElemType> void LinkList<ElemType>::SetHead(LinkNode<ElemType> *p) { head = p; }
template<class ElemType> void LinkList<ElemType>::SetTail(LinkNode<ElemType> *p) { tail = p; }
template<class ElemType> ElemType LinkList<ElemType>::GetElem(int pos) { if(pos < 1) return head->data; int num = 0; LinkNode<ElemType> *p = head; while(p->next) { num++; p = p->next; if(num == pos) return p->data; } return head->data; }
template<class ElemType> bool LinkList<ElemType>::ListInsert(int pos,ElemType e) { if(pos < 1) return false; int num = 0; LinkNode<ElemType> *p = head; LinkNode<ElemType> *t = new LinkNode<ElemType>(e); while(p->next) {
num++; if(num == pos) { t->next = p->next; p->next = t; return true; } p = p->next; } return false; }
template<class ElemType> bool LinkList<ElemType>::DelFirst() { if(!(head->next)) return false; LinkNode<ElemType> *t = head->next; head->next = t->next; delete t; if(!head->next) tail = head; return true; }
template<class ElemType> void LinkList<ElemType>::CreateList_Head(int n, ElemType *A) { int m = n; while(n) { InsFirst(*(A+(m-n))); n--; } }
template<class ElemType> void LinkList<ElemType>::CreateList_Tail(int n, ElemType *A) { int m = n; while(n) { InsEnd(*(A+(m-n))); n--; } }
template<class ElemType> ElemType LinkList<ElemType>::ListDelete(int pos) { LinkNode<ElemType> *p = head, *t; while(--pos) p = p->next; t = p->next; p->next = t->next; if(!p->next) tail = p; ElemType res = t->data; delete t; return res; }
template<class ElemType> bool LinkList<ElemType>::compare(const LinkList<ElemType> &b) { LinkNode<ElemType> *t = b.GetHead(), *p = head; while(p->next || t->next) { if(p->next->data != t->next->data) return false; p = p->next; t = t->next; } return true; }
template<class ElemType> bool LinkList<ElemType>::NextElem(LinkNode<ElemType> *p, ElemType &e) { if(p->next) e = p->next->data; else return false; return true; }
template<class ElemType> bool LinkList<ElemType>::ListTraverse() const { LinkNode<ElemType> *p = head; while(p->next != head) { p = p->next; cout<<'('<<p->num<<','<<p->data<<')'; if(p->next != head) cout<<"->"; } cout<<endl; return 1; }
|
顺序栈
const int MAXLISTSIZE = 100;
template<class ElemType> class SqStack{ private: ElemType *base; ElemType *top; int maxSize; public: SqStack(int ms = MAXLISTSIZE) { maxSize = ms; base = new ElemType[maxSize]; top = base; } ~SqStack(){StackDestroy();} bool StackClear( ){top = base;} int StackLength() const {return top - base;} bool StackisEmpty() const{ return top == base; } bool StackFull() const{ return base - top == maxSize;} bool GetTop(ElemType &e) const { e = *(top-1); } ElemType GetTop() const { return *(top-1); } bool push(ElemType &e) { if(StackFull()) return 0; *top = e; top++; return 1; } void print() { ElemType *p = base; while(p!=top) { cout<<*(p++); } cout<<endl; } bool pop(ElemType &e) { if(StackisEmpty()) return 0; GetTop(e); top--; return 1; } ElemType pop() { if(StackisEmpty()) return 0; ElemType t = GetTop(); top--; return t; } bool StackDestroy() { delete[] base; base = top = nullptr; } void StackTraverse() const { for(ElemType* i = base; i != top; i++) { cout<<*i; } } bool DoubleSpace() { maxSize *= 2; } bool isEqual(SqStack &t) const { if(t.StackLength() != this->StackLength()) return false; for(ElemType *p1 = base, *p2 = t.base; p1 != top; p1++, p2++) if(*p1 != *p2) return false; return true; } };
|
队列
顺序队列
const int MAXLISTSIZE = 100; template<class ElemType> class SqQueue{ private: ElemType *elem; int front; int rear; int maxSize; public: SqQueue(int ms = MAXLISTSIZE){maxSize = ms;front = rear = 0; elem = new ElemType[ms];} ~SqQueue(){QueueDestroy();} bool QueueClear(){rear = front;return true;}; bool QueueisEmpty() const{ return front == rear; } bool QueueFull() const{return rear+1 == front;} bool GetFront(ElemType &e) { if(!QueueisEmpty()) { e = elem[front]; return true; }else return false; } bool enQueue(const ElemType &e) { if(QueueFull()) return false; elem[rear] = e; rear++; return true; } bool deQueue(ElemType &e) { if(!QueueisEmpty()) { e = elem[front]; front++; return true; }else return false;
} bool QueueDestroy() { if(!elem) return false; delete[] elem; return true; } void print(); bool DoubleSpace(); }; template<class ElemType> void SqQueue<ElemType>::print() { int t = front; while(t != rear) { cout<<elem[t]; if(++t != rear) cout<<' '; } cout<<endl; }
|
链队列
template<class ElemType>
struct LinkQueueNode
{ ElemType data; LinkQueueNode<ElemType> *next; LinkQueueNode(LinkQueueNode<ElemType> *ptr = NULL){next = ptr;} LinkQueueNode(const ElemType &item, LinkQueueNode<ElemType> *ptr = NULL) { next = ptr; data = item; } ElemType getData(){ return data;} void SetLink( LinkQueueNode<ElemType> *link ){ next = link; } void SetData( ElemType value ){ data = value; }
};
template<class ElemType>
class LinkQueue{
private: LinkQueueNode<ElemType> *front; LinkQueueNode<ElemType> *rear; int length = 0;
public:
LinkQueue() { front = rear = new LinkQueueNode<ElemType>; } ~LinkQueue(){LinkQueueDestroy();} bool LinkQueueDestroy(); bool LinkQueueClear();
int QueueLength() const{ return length;}
bool QueueisEmpty() const{ return front == rear;}
bool deQueue( ElemType &e );
bool enQueue( ElemType e );
LinkQueueNode<ElemType>* GetFront() { return front;}
ElemType GetFrontData(){ return front->next->data;}
LinkQueueNode<ElemType>* GetRear() { return rear;}
bool QueueTraverse() const;
};
template <class ElemType> bool LinkQueue<ElemType>::LinkQueueDestroy() { if(!front) return 0; LinkQueueNode<ElemType> *p; while(front->next) { p = front->next; front->next = p->next; delete p; } delete front; front = rear = nullptr; return 1; }
template <class ElemType> bool LinkQueue<ElemType>::LinkQueueClear() { if(!front) return 0; LinkQueueNode<ElemType> *p; while(front->next) { p = front->next; front->next = p->next; delete p; } rear = front; return 1; }
template <class ElemType> bool LinkQueue<ElemType>::deQueue( ElemType &e ) { if(QueueisEmpty()) return 0; LinkQueueNode<ElemType> *p = front->next; e = p->data; front->next = p->next; delete p; length--; }
template <class ElemType> bool LinkQueue<ElemType>::enQueue( ElemType e ) { LinkQueueNode<ElemType> *p; p = new LinkQueueNode<ElemType>(e); rear->next = p; rear = p; length++; }
template <class ElemType> bool LinkQueue<ElemType>::QueueTraverse() const { if(QueueisEmpty()) return 0; LinkQueueNode<ElemType> *p = front; while(p->next) { p = p->next; cout<<p->data<<' '; } return 1; }
|
二叉树
还没写TT