【C++数据结构学习笔记---线性表】带头结点的单循环链表

【C++数据结构学习笔记---线性表】带头结点的单循环链表

一个简单的实现例子,只用到了插入函数以及输出函数,初始化26个英文字母。

插入算法的思路:(insert)本算法为结点后插入

1、声明一结点p指向头结点,初始化i从0开始。

2、遍历链表,让指针p向后移动,直至移动到要插入元素的结点,即向后移动k-1次。

3、在系统中新建一个结点s。

4、使用s->next=p->next; p->next=s;语句来插入。

5、加入一个判断,判断插入的结点是否在尾指针之后,如果是,则移动尾指针last=s;

删除算法的思路:(erase)本算法为删除第k个结点

1、声明一结点p指向链表第一个结点,初始化i从0开始。

2、遍历链表,让指针p向后移动,一直移动到要删除结点的前一个结点,即向后移动k-1次。

3、判断p是否等于last,如果是则说明要删除的是头结点,这个是不允许的,则此次删除无效。

如果不等于,则执行4。

4、判断要删除的结点是否为last如果是,则需要把last指针往前移动一次,即last=p;

5、执行删除语句p->next=q->next; delete q;

#include 
using namespace std;
template 
class List;
template 
class Node{
	friend class List;
private:
	T data;
	Node *next;
};
template 
class List{
public:
	List();											//构造函数
	~List();										//析构函数
	bool empty()const{return (last->next==last);}	//测试表是否为空
	int size()const;								//返回表的长度
	bool retrieve(int k,T& x)const;					//返回表位置k处的元素x
	int locate(const T& x);							//返回元素x在表中的位置
	List& insert(int k,const T& x);				//在位置k处插入元素x
	List& erase(int k);							//从位置k处删除元素
	void print_list()const;							//打印表
private:
	Node *last;
};
template 
List::List()
{
	Node *p=new Node;
	p->next=p;
	last=p;
}

template 
List::~List()
{
	Node *p=0;
	while(p!=last){
		p=last->next;
		delete last;
		last=p;
	}
	delete last;
}
template 
int List::size()const
{
	Node *p=last->next->next;
	int len=1;
	while(p!=last){
		p=p->next;
		++len;
	}
	return len;
}
template 
bool List::retrieve(int k,T& x)const
{
	Node *p=last->next;
	int i=0;
	while(inext;
		++i;
	}
	if (p!=last->next){
		x=p->data;
		return true;
	}
	else
		return false;
}

template 
int List::locate(const T& x)
{
	Node *p=last->next->next;
	int i=1;
	while(p!=last->next){
		if (x==p->data) return i;
		p=p->next;
		++i;
	}
	return 0;
}
template 
List& List::insert(int k,const T& x)
{
	Node *p=last->next;
	int i=0;
	while(p!=last && inext;
		++i;
	}
	Node *s=new Node;
	s->data=x;
	s->next=p->next;
	p->next=s;
	if (p==last) last=s;
	return *this;
}

template 
List& List::erase(int k)
{
	Node *p=last->next;
	int i=0;
	while(inext;
		++i;
	}
	if (p!=last){
		if (p->next==last)last=p;
		Node *q=p->next;
		p->next=q->next;
		delete q;
	}
	return *this;
}
template 
void List::print_list()const
{
	Node *p=last->next->next;
	while(p!=last->next){
		cout <data <<" ";
		p=p->next;
	}
}
int main()
{
	int s1,s2;
	s1='A';
	s2='Z';
	List p;
	for(int i=s2;i>=s1;--i){
		p.insert(0,i);
	}
	p.print_list();
	return 0;
}


 

你可能感兴趣的:(数据结构,【原创】)