#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