线性表心得

来源:互联网 发布:昆明网店美工培训 编辑:程序博客网 时间:2024/05/26 12:01

</pre>顺序表:<p></p><p>顺序表实质是一个数组。</p><p>链表:</p><p>链表要先定义一个结点类Link,再通过链表类实现连串各个结点类。</p><p>Link类:</p><pre name="code" class="cpp">#include<iostream>using namespace std;template<typename E>class Link{public://创建可利用空间表static Link<E> *freelist;//常规的Link数据成员和成员函数E val;Link *next;Link(E it,Link *nex){val=it;next=nex;}Link(){next=NULL;}
LList链表类:

template<typename E>class LList:public List<E>{private:Link<E> *head,*curr,*tail;int cnt;//定义初始化函数void init(){curr=head=tail=new Link<E>;cnt=0;}//定义移除所有链表函数void removeall(){while(head->next!=NULL){curr=head;head=head->next;delete curr;}}public:LList(){init();}~LList(){removeall();}void clear(){removeall();init();}void insert(const E& it){curr->next=new Link<E>(it,curr->next);if(curr==tail)tail=curr->next;cnt++;}//在表尾插入void append(const E& it){tail->next=new Link<E>(it,NULL);tali=tail->next;cnt++;}//remove函数是删除curr->nextE remove(){assert(curr->next!=NULL);Link<E> *temp=curr->next;if(curr->next==tali)tali=curr;int tempval=curr->next->val;curr->next=curr->next->next;delete ltemp;cnt--;return tempval;}void moveToStart(){curr=hand;}void moveToEnd(){curr=tail;}void prev(){if(curr==head)return;Link<E> *temp=head;while(temp->next!=curr)temp=temp->next;curr=temp;}void next(){if(curr==tail)return;else curr=curr->next;}int length() const{returncnt;}//curr当前下标int currpos(){Link<E> *temp=head;int i=0;while(temp!=curr){temp=temp->next;i++;}return i;}void moveToPos(int pos){if(pos<0||pos>cnt){cout<<"Position out of range"<<endl;return;}curr=head;for(int i1=0;i<pos;i++)curr=curr->next;}E& getvalue(){if(curr->next==NULL){cout<<"NO VALUE"<<endl;reeturn;assert(0);}return curr->next->value;}};


通过线性表可实现栈,队列等数据结构。

扩展:可利用空间表

可利用空间表是定义在Link类中的一个(可选)方法。通过重载delete和new操作符,将要delete的链表放在一个静态freelist链表中储存,需要new时再从这个freelist链表中return回一个结点。

//可利用空间表重载new和deletevoid *operator new(size_t){if(freelist==NULL)return::new Link();Link<E> *temp=freelist;freelist=freelist->next;return temp;}void operator delete(void *ptr){((Link<E>*)ptr)->next=freelist;freelist=(Link<E>*)ptr;}


扩展:双链表,即有左右两个指针。在Link类中定义即可





0 0