您的位置:首页 > 其它

线性表心得

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类中定义即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: