线性表心得
2016-02-01 16:09
204 查看
</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->next E 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{ return cnt; } //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和delete void *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类中定义即可
相关文章推荐
- 从头认识Spring-1.11 注入List或Set(这个例子比较体现代码复用)
- 不同种类软件的比较
- jQuery速查表
- 取消pppoe后,mysql正常退出!
- Android EventBus 的项目使用
- variadic template (可变参数模板)
- Time操作
- 天津Uber优步司机奖励政策(2月1日~2月7日)
- Hello Makefile
- SQL server(MSSQL)客户端工具登录数据库的两种命令行登录方式
- 设置App运行在后台
- JavaScript 调用PHP
- LeetCode:Same Tree
- erlang开发工具之intellij idea基本使用
- mysql binlog_format 适时修改
- 数组名和指针
- 自学Android 坑1
- 下拉刷新、上拉加载更多控件实现原理及解析(二)
- Protocol Buffer技术详解(C++实例)
- epoll例子