链表基于数组的实现:
typedef int ItemType; typedef void (*FuncT)(ItemType &_item); class List { public: List(); List(int num,const ItemType &_item); List(const List & _list); bool isEmpty()const; bool isFull()const; int getLength()const; int getMaxSize()const; void insert(int index,const ItemType &_item=ItemType()); void remove(const ItemType &_item); void erase(int index); void retrieve(int index,ItemType &_item); void traverse(FuncT visit); private: enum{MAX=20}; ItemType alist[MAX]; int size; };#include<cstddef> #include<cassert> #include"list_array2.h" List::List():size(0) { } List::List(int num,const ItemType &_item) { size=num; for(int i=0;i<num;i++) alist[i]=_item; } List::List(const List &_list) { size=_list.size; for(int i=0;i<size;i++) alist[i]=_list.alist[i]; } bool List::isEmpty()const { return size==0; } bool List::isFull()const { return size==MAX; } int List::getLength()const { return size; } int List::getMaxSize()const { return MAX; } void List::insert(int index,const ItemType &_item) { assert(!isFull()); assert(index>0&&index<=size); size++; int i; for(i=size-1;i>=index;i--) alist[i]=alist[i-1]; alist[i]=_item; } void List::remove(const ItemType &_item) { assert(!isEmpty()); int p; for(p=0;(_item!=alist[p])&&(p<size);p++) { } assert(p!=size-1); size--; int i; for(i=p;i<size;i++) alist[i]=alist[i+1]; alist[i]=ItemType(); } void List::erase(int index) { assert(index>0&&index<=size); size--; int i; for(i=index-1;i<size;i++) alist[i]=alist[i+1]; alist[i]=ItemType(); } void List::retrieve(int index,ItemType &_item) { assert((index>0)&&(index<=size)); _item=alist[index-1]; } void List::traverse(FuncT visit) { for(int i=0;i<size;i++) visit(alist[i]); }
链表基于数组实现2(数组项由数组索引链接):
typedef int ItemType; typedef void (*FuncT)(ItemType &_item); class List { public: List(); bool isEmpty()const; int getLength()const; void insert(int index,ItemType &_item);//ignore exception void remove(int index);//ignore exception void retrieve(int index,ItemType &_item);//ignore exception void traverse(FuncT visit); private: enum{MAX=20}; class Node { private: ItemType item; int next; public: Node(); Node(ItemType &_item,int _next); int getNext()const; void setNext(int _next); void setItem(ItemType _item); ItemType & getItem(); }; Node alist[MAX]; int head; int free; int size; int find(int index)const; }; #include"list_array.h" List::Node::Node():item(),next(-1) { } List::Node::Node(ItemType &_item,int _next) { item=_item; next=_next; } int List::Node::getNext()const { return next; } void List::Node::setNext(int _next) { next=_next; } void List::Node::setItem(ItemType _item) { item=_item; } ItemType &List::Node::getItem() { return item; } List::List() { size=0; free=0; head=-1; int i; for(i=free;i<MAX-1;i++) alist[i].setNext(i+1); alist[i].setNext(-1); } int List::find(int index)const { if((index<1)||(index>size)) return -1; else { int i=1; int temp=head; while(i<index) { temp=alist[temp].getNext(); i++; } return temp; } } bool List::isEmpty()const { return (size==0); } int List::getLength()const { return size; } void List::insert(int index,ItemType &_item) { size++; if(head==-1) { head=0; alist[head]=Node(_item,-1); free=1; } else { if(index==1) { int temp=free; free=alist[free].getNext(); alist[temp]=Node(_item,head); head=temp; } else { int pre=find(index-1); int temp=free; free=alist[free].getNext(); alist[temp]=Node(_item,alist[pre].getNext()); alist[pre].setNext(temp); } } } void List::remove(int index) { if(index==1) { int temp=head; head=alist[head].getNext(); alist[temp].setNext(free); alist[temp].setItem(ItemType()); free=temp; } else { int pre=find(index-1); int temp=free; free=alist[pre].getNext(); alist[pre].setNext(alist[free].getNext()); alist[free].setNext(temp); alist[free].setItem(ItemType()); } size--; } void List::retrieve(int index,ItemType &_item) { int cur=find(index); _item=alist[cur].getItem(); } void List::traverse(FuncT visit) { int cur=head; while(cur!=-1) { visit(alist[cur].getItem()); cur=alist[cur].getNext(); } }链表基于指针的实现:
#include<cstddef> typedef int ItemType; typedef void (*FuncT)(ItemType &_item); class List { public: List(); List(const List &_list); ~List(); bool isEmpty()const; int getLenght()const; void insert(int index,ItemType &_item);//ignore exception void remove(int index);//ignore exception void retrieve(int index,ItemType &_item)const;//ignore exception void traverse(FuncT visit); private: struct Node { ItemType item; Node * next; }; int size; Node *head; Node *find(int index)const; }; #include"list_pointer.h" #include<cstddef> #include<cassert> List::List() { size=0; head=NULL; } List::List(const List &_list) { if(_list.head==NULL) head=NULL; else { head=new Node; assert(head!=NULL); head->item=_list.head->item; Node *newP=head,*temp=_list.head->next; while(temp!=NULL) { newP->next=new Node; assert(newP->next!=NULL); newP=newP->next; newP->item=temp->item; temp=temp->next; } newP->next=NULL; } size=_list.size; } List::~List() { while(head!=NULL) { Node *temp=head; head=head->next; delete temp; } } List::Node *List::find(int index)const { if((index<=1)||(index>size)) return NULL; else { Node *temp=head; for(int i=2;i<index;i++) temp=temp->next; return temp; } } bool List::isEmpty()const { return (head==NULL); } int List::getLenght()const { return size; } void List::insert(int index,ItemType &_item) { Node *newP=new Node; assert(newP!=NULL); newP->item=_item; size++; if(index==1) { newP->next=head; head=newP; } else { Node *pre=find(index); newP->next=pre->next; pre->next=newP; } } void List::remove(int index) { size--; Node *temp; if(index==1) { temp=head; head=head->next; temp->next=NULL; delete temp; } else { Node* pre=find(index); temp=pre->next; pre->next=pre->next->next; temp->next=NULL; delete temp; } } void List::retrieve(int index,ItemType &_item)const { if(index==1) _item=head->item; else { Node *pre=find(index); _item=pre->next->item; } } void List::traverse(FuncT visit) { Node *temp=head; while(temp!=NULL) { visit(temp->item); temp=temp->next; } }标准模板库类list:
template<class T> class std::list { public: list(); //Default costructor ;initializes an empty list; //precondition :None; //Postcondition :An empty list will exists; list(size_type num,const T&val=T()); //Constructor;initializes list to have num elements; //with value val //precondition :None; //postcondition:A list with num elements. list(const list<T>&anotherlist); //Constructor ;initialize a list to have the same //elements with anotherlist //precodition :None; //postcondition :A list with same elements of the anotherlist will exists size_type size()const; //Determines the length of the list ,size_type is //an integral type //precondition :none; //postcondition :Returns the number of items the //list that are currently in the list size_type max_size()const; //determine the maxium number of items the list //can hold //precondition :NOde; //postcondition :Returns the maxium number of items bool empty()const; //determines whether a list is emtpy //precondition :None; //postcondition :return true if the list is empty, //otherwise returns false. iterator insert(iterator i,const T &val=T()); //Insert a item val into a the list immediately //before the element specified by the iterator i, //precondition :the iterator must be initialized , //even if the list is empty //Postcondition :Item val is inserted into the list //and an iterator to the newly inserted item is returned; void remove(const T&val); //Remove all items with value val from the list. //precondition :Node //postcondition:The list has no item with value val. iterator erase(iterator i); //remove the item in the list pointed to the iterator i //Precondition :the iterator must be initialized to //point to an element in the list //postcondition :Returns an iterator to the item following //the removed item .If the removed is the last item in //the list the iterator value will be the same as the //value returned by end(). iterator begin(); //returns an iterator to the first item in the list //Precondition : None; //Postcondition :if the list is empty the iterator value //will be the same as the value returned by end(); iterator end(); //Returns an iterator value that can used to test //whether the end of the list has been reached //precondition :iNone; //postcondition :the iterator value for the end of the //list is returned void sort(); //sorts elements according to the operator< and //maintains the relative order of equal elements //precondition :None; //Postcondition :the list is sorted in ascending order. };