总是用c来写总感觉怪无聊的,索性就换个语言来试一试,这次用c++
//是的你没有看错,我要用c++来写了,只用c多无聊啊
typedef class DoubleLinkedListNode *DLNode;
class DoubleLinkedListNode
{
public:
ElementType info;
DLNode next,pre;
public:
DoubleLinkedListNode()//构造函数
{
next = NULL;//指针初始化
pre = NULL;
}
DoubleLinkedListNode(ElementType x;DLNode n = NULL,DLNode p = NULL)
{
info = x;//构造时赋值
next = n;
pre = p;
}
}
class DoubleLinkedList
{
private:
PtrToNode head;//头指针
PtrToNode tail;//尾指针
public:
//构造函数
DoubleLinkedList()
{
head = NULL;
tail = NULL;
}
//析构函数
~DoubleLinkedList();
//插入节点(以个数索引插入)
bool insert(int index,ElementType data);
//插入节点(以地址为索引)
bool insert(PtrToNode p,ElementType data);
//尾部追加节点
bool appendTail(ElementType x);
//头部追加节点
bool appendHead(ElementType x);
//从头部删除节点
ElementType deleteHead();
//从尾部删除节点
ElementType deleteTail();
//以存储值为标记删除节点
bool deleteNode(ElementType x);
//判断链表是否为空
bool isEmpty();
//打印链表
void printList();
}
DoubleLinkedList::~DoubleLinkedList()
{
PtrToNode p;
while(!isEmpty())
{
p = head->next;//头节点也会被释放
delete head;
head = p;
}
}
bool DoubleLinkedList::insert(int index,ElementType data)
{
count = 0;//记录遍历索引
PtrToNode temp = head;
while(temp && count != index - 1)//遍历到指定位置前一个节点
{
count++;
temp = temp->next;
}
if(temp)//未找到
{
reutrn false;
}
else//插入节点
{
temp->next = temp->next->pre = new DoubleLinkedListNode(data,temp->next,temp);
}
}
bool DoubleLinkedList::insert(PtrToNode p,ElementType data)
{
PtrToNode temp = head;
while(temp && temp->next != p)//遍历到指定节点之前
{
temp = temp->next;
}
if(temp)
{
return false;
}
else//插入节点
{
temp->next = temp->next->pre = new DoubleLinkedListNode(data,temp->next,temp);
}
}
bool DoubleLinkedList::appendTail(ElementType x)
{
if(tail != NULL)//如果链表不为空
{
tail->next = new DoubleLinkedListNode(x,tail);//在尾部插入新节点
tail = tail->next;//尾指针后移
}
else//如果链表为空
{
head = tail = new DoubleLinkedListNode(x);//建立新节点
}
}
bool DoubleLinkedList::appendHead(ElementType x)
{
head = head->pre= new DoubleLinkedListNode(x,NULL,head);//头部插入新节点,头指针指向新节点
if(tail == 0)//如果是空链表,则头尾指针指向唯一节点
{
tail = head = new DoubleLinkedList(x);
}
}
ElementType DoubleLinkedList::deleteHead()
{
if(isEmpty())//如果链表为空
{
return ERROR;
}
ElementType el = head->info;//保存节点值
PrtToNode temp = head;//临时指向首元节点
if(head == tail)//只有一个节点
{
head = tail = NULL;
}
else
{
head = head->next;
head->pre = NULL;
}
delete temp;
return el;
}
ElementType DoubleLinkedList::deleteTail()
{
if(isEmpty())
{
return ERROR;
}
int el = tail->info;//保存节点值
PtrToNode temp = tail;
if(head == tail)//只有一个节点
{
head = tail = NULL;
}
else
{
tail = tail->pre;
tail->next = NULL;
}
delete temp;
return el;
}
bool DoubleLinkedList::deleteNode(ElementType x)
{
if(isEmpty())
{
return false;
}
PtrToNode temp = head;
while(temp && temp->info != x)//遍历直到找到该节点
{
temp = temp->next;
}
if(head = tail)//若只有一个节点
{
head = tail = NULL;
delete temp;
return true;
}
if(temp == head)
{
deleteHead();
}
if(temp == tail)
{
deleteTail();
}
if(temp)//若未找到
{
return false;
}
else
{
temp->next->pre = temp->pre;
temp->pre->next = temp->next;
delete temp;
return true;
}
}
bool DoubleLinkedList::isEmpty()
{
if(tail == NULL)
{
return true;
}
else
{
return false;
}
}
void DoubleLinkedList::printList()
{
if(isEmpty())
{
cout << "List is empty!" << endl;
}
else
{
PtrToNode temp;
temp = head;
while(temp)
{
cout << temp->info << endl;
}
}
}