- 追加された行はこの色です。
- 削除された行はこの色です。
#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;
}