#pragma once
 
	#include <iostream>
	using namespace std;
 
	template <class T>
	class list
	{
	private:
		int length;
		list *head,*tail,*prev,*next;
		T data;
	public:
		list(void);
		virtual ~list(void);
		void addlisthead(T setdata);
		void addlist(int addnum,T setdata);
		void addlisttail(T setdata);
		void dellist(int delnum);
		void dellisthead();
		void dellisttail();
		T get(int getnum);
		void set(int setnum,T setdata);
		int getlength();
	};
 
 
	//コンストラクタ
	template <class T>
	list<T>::list(void):length(0),head(NULL),tail(NULL),prev(NULL),next(NULL)
	{
	}
 
 
	//デストラクタ(全てのリストを解放)
	template <class T>
	list<T>::~list(void)
	{
		
		list* tmplist = head;
		list* del = NULL;
		
		while(tmplist != NULL)
		{
			del = tmplist;
			tmplist = tmplist->next;
 
			delete del;
		}
 
	}
 
	// 先頭追加(指定番号)
	template <class T>
	void list<T>::addlisthead(T setdata)
	{
		if(head == NULL)
		{
			head = new list<T>;
			tail = head;
			head->data = setdata;
			return;
		}
 
		// リスト長を増やす
		length++;
 
		list* tmplist = head;
 
		// リスト追加
		tmplist->prev = new list<T>;
		tmplist->prev->next = tmplist;
		tmplist->prev->prev = NULL;
		tmplist->prev->data = setdata;
 
		// ヘッドを移行
		head = tmplist->prev;
 
	}
 
 
	// 指定番号追加(指定番号)
	template <class T>
	void list<T>::addlist(int addnum,T setdata)
	{
		
		// 最小以下
		if(addnum < 0)
			addnum = 0;
 
		// 最大以上
		if(addnum > length)
			addnum = length;
 
 
		if(head == NULL)
		{
			head = new list<T>;
			tail = head;
			head->data = setdata;
			return;
		}
 
		// リスト長を増やす
		length++;
 
		list* tmplist = head;
 
		for(int i = 0;i < addnum;++i)
			tmplist = tmplist->next;
 
		// 末尾だったら
		if(tmplist->next == NULL)
		{
			tmplist->next = new list<T>;
			tmplist->next->next = NULL;
			tmplist->next->prev = tmplist;
			tmplist->next->data = setdata;
 
			// テイルを移行
			tail = tmplist->next;
		}
		// 先頭だったら
		else if(tmplist->prev == NULL)
		{
			// リスト追加
			tmplist->prev = new list<T>;
			tmplist->prev->next = tmplist;
			tmplist->prev->prev = NULL;
			tmplist->prev->data = setdata;
 
			// ヘッドを移行
			head = tmplist->prev;
		}
		// 中間だったら
		else
		{
			//つなぎなおし
			tmplist->prev->next = new list<T>;
			tmplist->prev->next->prev = tmplist->prev;
			tmplist->prev->next->next = tmplist;
			tmplist->prev = tmplist->prev->next;
 
			tmplist->prev->data = setdata;
		}
 		
	}
 
 
	// 末尾追加(指定番号)
	template <class T>
	void list<T>::addlisttail(T setdata)
	{
	 	
		if(head == NULL)
		{
			head = new list<T>;
			tail = head;
			head->data = setdata;
			return;
		}
 
		// リスト長を増やす
		length++;
 
		list* tmplist = head;
 		
		// リストを辿って末端のノードに接続
		while(tmplist->next != NULL)
		{
			tmplist = tmplist->next;
		}
 
		// リストの生成
		tmplist->next = new list<T>;
		tmplist->next->next = NULL;
		tmplist->next->prev = tmplist;
		tmplist->next->data = setdata;
 
		// テイルを移行
		tail = tmplist->next;
 
	}
 
	// 先頭削除
	template <class T>
	void list<T>::dellisthead()
	{
		//削除不能
		if(length < 0)
			return;
 
		list* del = head;
		head = head->next;
		head->prev = NULL;
 
		delete del;
 		
		length--;
	}
 
 
	// 指定番号削除
	template <class T>
	void list<T>::dellist(int delnum)
	{
		//削除不能
		if(length < 0)
			return;
 
		// 最小以下
		if(delnum < 0)
			delnum = 0;
 
		// 最大以上
		if(delnum > length)
			delnum = length;
 
		list* tmplist = head;
		list* del;
 
		for(int i = 0;i < delnum;++i)
			tmplist = tmplist->next;
 
		del = tmplist;
 
		// 末尾
		if(tmplist->next == NULL)
		{
			tail = tail->prev;
			tail->next = NULL;
		}
		// 先頭
		else if(tmplist->prev == NULL)
		{
			head = head->next;
			head->prev = NULL;
		}
		// 中間
		else
		{
			tmplist->prev->next = tmplist->next;
			tmplist->next->prev = tmplist->prev;
		}
 
		delete del;
 
		length--;
	}
 
	// 末尾削除
	template <class T>
	void list<T>::dellisttail()
	{
		//削除不能
		if(length < 0)
			return;
 
		list* del = tail;	
		tail = tail->prev;
		tail->next = NULL;
 
		delete del;
 
		length--;
	}
 
 
	// 指定番号のリストデータを取り出す
	template <class T>
	T list<T>::get(int getnum)
	{
		// 最小以下
		if(getnum < 0)
			getnum = 0;
 		
		// 最大以上
		if(getnum > length)
			getnum = length;
  
 		list* tmplist = head;
 
		for(int i = 0;i < getnum;++i)
			tmplist = tmplist->next;
 
		return tmplist->data;
	}
  
	// 指定番号のリストデータにデータを追加する
	template <class T>
	void list<T>::set(int setnum,T setdata)
	{
		// 最小以下
		if(setnum < 0)
			setnum = 0;
		
		// 最大以上
		if(setnum > length)
			setnum = length;
 
		list* tmplist = head;
 
		for(int i = 0;i < setnum;++i)
			tmplist = tmplist->next;
 
		tmplist->data = setdata;
	}
 
 
	// リスト長を返す
	template <class T>
	int list<T>::getlength()
	{
		return length + 1;
	}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS