线性表心得

</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类中定义即可





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值