自己写个list玩玩

/*如果采用单向链表,end()函数如何表示?
 *所以必须得采用循环链表的方式?
 *
 */

#ifndef LIST
#define LIST

#include<iostream>

using namespace std;

//声明
template <class T>
struct Node{
	T data;
	struct Node<T>* next;
	Node(struct Node<T>* p):data(p->data),next(p->next){}
	Node(){}
};

template <class T>
struct _iterator{//迭代器
	typedef Node<T> ListNode;
	typedef ListNode* pListNode;

	_iterator(){}
	_iterator(pListNode p):pToNode(p){}
	_iterator(const _iterator& p):pToNode(p.pToNode){}

	const _iterator& operator=(const _iterator& rhs)
	{
		pListNode temp=pToNode;
		pToNode=new ListNode(rhs.pToNode);
		delete temp;
		temp=NULL;
		return *this;
	}

	const _iterator& operator=(const pListNode& rhs)
	{
		pListNode temp=pToNode;
		pToNode=new ListNode(rhs);
		delete temp;
		temp=NULL;
		return *this;
	}

	T operator*()
	{
		return (*pToNode).data;
	}

	//单向链表,没有自减操作
	_iterator& operator++()
	{
		pToNode=pToNode->next;
		return *this;
	}
	_iterator operator++(int)
	{
		_iterator tmp=*this;
		++*this;
		return tmp;
	}

	bool operator==(const _iterator& p)
	{
		return pToNode==p.pToNode;
	}

	bool operator!=(const _iterator& p)
	{
		return pToNode!=p.pToNode;
	}

	pListNode pToNode;
};

template <class T>
class ListSelf{
public:
	ListSelf<T>()
	{
		node=new ListNode();
		//node->data=0;//初始化,类型未确定,故不能初始化
		node->next=node;
	}

	typedef Node<T> ListNode;
	typedef ListNode* pListNode;
	typedef _iterator<T> iterator;

	void push_back(const T& value);
	void push_front(const T& value);
	void pop_back();
	void pop_front();

	iterator begin()const
	{return iterator(node->next);}
	iterator end()const
	{return iterator(node);}

	T front()const;
	T back()const;
	void print(ostream& output=cout)const;
	int size()const;

	void erase(iterator& ,int n);
	void erase(iterator& iter);

private:
	pListNode node;
};

//实现
template <class T>
void ListSelf<T>::push_back(const T& value)
{
	pListNode p=node;
	while(p->next!=node)
	{
		p=p->next;
	}
	pListNode newNode=new ListNode();
	newNode->data=value;
	newNode->next=node;
	p->next=newNode;
}

template <class T>
void ListSelf<T>::print(ostream& output) const
{
	pListNode p=node;
	if(p->next==node)
		return;
	do{
		p=p->next;
		output<<p->data<<"  ";
	}while(p->next!=node);
	output<<endl;
}

template <class T>
int ListSelf<T>::size() const
{
	pListNode p=node;
	int j(0);
	while(p->next!=node)
	{
		j++;
		p=p->next;
	}
	return j;
}

template <class T>
void ListSelf<T>::push_front(const T& value)
{
	pListNode p=node;
	pListNode q=new ListNode();
	q->data=value;
	q->next=p->next;
	p->next=q;
}

template <class T>
void ListSelf<T>::pop_back()
{
	pListNode p=node;
	pListNode q=p;
	while(p->next!=node)
	{
		q=p;
		p=p->next;
	}
	if(p==q)
		return;
	else
	{
		q->next=p->next;
		delete p;
		p=NULL;
	}
}

template <class T>
void ListSelf<T>::pop_front()
{
	pListNode p=node;
	if(p->next==node)//throw error
		return;
	p=p->next;
	node->next=p->next;
	delete p;
	p=NULL;
}

template <class T>
T ListSelf<T>::front() const
{
	pListNode p=node;
	if(p->next==node)
		return -1;//should throw error
	p=p->next;
	return p->data;
}

template <class T>
T ListSelf<T>::back() const
{
	pListNode p=node;
	if(p->next==node)
		return -1;//should throw error
	while(p->next!=node)
	{
		p=p->next;
	}
	return p->data;
}

template <class T>
void ListSelf<T>::erase(iterator& iter,int n)
{
	pListNode p=node;
	while(p->next!=iter.pToNode && p->next!=node)
	{
		p=p->next;
	}
	if(p->next==node)
		return;
	int i=0;

	do{
		pListNode q=p;
		p=p->next;
		q->next=p->next;
		delete p;
		p=q;
		i++;
	}while(i<n && p->next!=node);

	iter.pToNode=p->next;
	// iter=p->next;
}

template <class T>
void ListSelf<T>::erase(iterator& iter)
{
	pListNode p=node;
	while(p->next!=iter.pToNode && p->next!=node)
	{
		p=p->next;
	}
	if(p->next==node)
		return;
	pListNode q=p;
	p=p->next;
	q->next=p->next;
	delete p;
	p=NULL;
	iter.pToNode=q->next;
}

#endif //LIST

时间: 2024-07-30 17:49:05

自己写个list玩玩的相关文章

Delphi - 闲来无事,自己写个Timer玩玩(多线程Timer)

明天去坐火车,回家,今天就没有事做,本来在弄一个跨进程获取其他程序里面组件,如ListView,ListBox,Button等的信息,突然有个想法自己写个Timer,不用SetTimer函数,我们自己用个多线程也正好实现这个.反正前段时间多线程也弄得比较多,本来想单独讲讲的,现在就用个例子来说明吧.写成一个控件:utTimer.pas 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

无聊写个TweenLite玩玩

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Fun</title> <script type="text/javascript" src='http://cdnjs.cloudflare.com/ajax/libs/gsap/latest/plugins/CSSPlugin.

简单的玩玩etimer &lt;contiki学习笔记之九&gt;

好吧,我承认etimer有点小复杂,主要是它似乎和contiki的process搅在一起,到处都在call_process.那就先搜搜contiki下的etimer的example看看,然后再试着写一个demo玩玩. 在写demo之前,先说说自己是怎么找到etimer 的example的文件的. 在core/sys/etimer.h 文件中,在描述etimer的数据结构的时候,作者显示的指出,如果要使用etimer,就必须先使用 etimer_set()这个函数进行一些工作,如图: 是的,数据结

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧

usaco月赛,2017.1总结

T1:跳舞的奶牛 大致题意:一个体积为k的舞台能够同时容纳k只奶牛一起跳舞,他们每头奶牛的跳舞时间不同,如果有一只奶牛跳完了第k+1头奶牛就会立刻上场跳舞,当所有奶牛跳完舞以后我们认为这次表演结束.现在给出奶牛个数,最多用时,每头奶牛的跳舞时间.求舞台最小为多大. 思路:本来写了个程序以为这道题很简单,刚开始排一下序然后就行了,结果交了以后发现只过了五组,然后才发现这道题不能改变顺序(所以说为什么我改变顺序了还是能过五组,usaco的数据也好水......),所以说我想到了堆,然后就用堆写了一下

用urllib2实现简单的网络爬虫1

玩python的同学都避免不了想写个爬虫玩玩,并且一般都以抓取XX图片为主,当然楼主也不例外~~ 这里先用比较原始的方式:urllib2 + 正则表达式,后面再尝试requests 背景:假设有个网站,是关于一些艺术家及其作品介绍的,登陆进去后,每一页是艺术家的头像和名字列表(由于艺术家很多,所以有很多页):  点击艺术家的头像或名字,就进入该艺术家的主页,主页上有该艺术家的详细介绍和作品列表(由于每个艺术家有很多作品,所有可能会有很多页):   点击其中一部作品,就进入该作品的详细介绍页面,包

《2015最新Android基础入门教程》完结散花~

<2015最新Android基础入门教程>完结散花~ 标签(空格分隔): 反思小结 引言: 从六月底就开始编写这套教程,历时将近五个多月,今天终于写完了,全套教程正文部分148篇, 十大章,从基本UI控件到四大组件,Intent,Fragment,事件处理,数据存储,网络编程,绘图与动画, 多媒体,系统服务等都进行了详细的讲解!代码都是都是在Android Studio上进行编写的,全文 采用Markdown,行文结构清晰,还结合了实际开发中一些常见的问题进行了剖析-由于个人能力的局限, 虽然

搭建theos:在windows上进行ios开发

鉴于现在在百度里能搜到的关于ios开发的东西,我先讲为什么写这篇博客:开发越狱ios可以不用mac os!! 以前就想给iphone写些程序玩玩,但是网上总说需要一台苹果电脑才行,为此我曾在PC上安装苹果系统,或者是用虚拟机,结果极其不爽而放弃.收到微软关于visual studio2015rc消息的邮件,其中一条可以用c#开发ios,于是忍不住下在下来安装,结果坑爹的需要连接一台mac(我要有mac我还用c#?).这条路断了之后看cydia里的开发者专区,去看看http://iphonedev

php万年历

上图是效果,刚学php,写个万年历玩玩- <!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>php万年历</title>    <style>        #dusk{            text-align:center;            padding-top:50px;        }        h1{