带头结点的双链表的实现:在单链表的基础上再加上了一个指向前驱节点的指针
#include<iostream>
#include <cstdio>
#include<stdlib.h>
using namespace std;
//双链表
typedef struct DLNode{
int data;
struct DLNode *prior;
struct DLNode *next;
}*DLinkList;
//双链表的初始化,也就是创建一个新的节点
DLinkList InitDLinkList(DLinkList &DL)
{
DL = new DLNode();//创建头结点
DL->data = -1;
DL->prior = NULL;
DL->next = NULL;
return DL;
}
//头插法创建
DLinkList CreatDLinkList1(DLinkList &DL)
{
int val;
DLinkList temp,head = DL;
cin>>val;
while(val!=9999)
{
temp = new DLNode();//新节点
temp->data = val;
temp->next = head->next;
temp->prior = DL;
head->next = temp;
cin>>val;
}
return head;
}
//尾插法建立单链表
DLinkList CreatDLinkList2(DLinkList &DL)
{
int val;
DLinkList temp,rear = DL;
cin>>val;
do
{
temp = new DLNode();
temp->data = val;
temp->next = NULL;
rear->next = temp;
temp->prior = rear;
rear = temp;
cin>>val;
}while(val != 9999);
return DL;
}
//双链表的长度
int DLinkListLength(DLinkList DL)
{
int length = 0;
DLinkList p = DL->next;
while(p != NULL)
{
length++;
p = p->next;
}
return length;
}
//打印所以元素
void PrintDLinkList(DLinkList DL)
{
int foot = 0;
int flag = 0;
DLinkList s;
s = DL;
printf("DList Information\n");
while (flag == 0)
{
if (s->next == NULL)
{ //当遍历到最后一个元素时退出
flag = 1;
}
printf(" |- List %d : %d\n", foot++, s->data);
s = s->next;
}
printf("Node_count : %d\n", DLinkListLength(DL));
}
//双链表的删除,按查找位置删除
bool Delete(DLinkList &DL,int i)
{
DLinkList p = DL->next;
int len = 0;
if(i<0||i>DLinkListLength(DL))
return false;
while(len<i)
{
p = p->next;
len++;
}
p->prior->next = p->next;
p->next->prior = p->prior;
delete(p);
return true;
}
//双链表的插入,按给定位置之后插入
bool Insert(DLinkList &DL,int i)
{
DLinkList p = DL;
DLinkList s;
int val,len = 0;
if(i<0||i>DLinkListLength(DL)+1)
return false;
while(len<i)
{
p = p->next;
len++;
}
s = new DLNode();
cout<<"输入插入节点的值:";
cin>>val;
s->data = val;
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
int main()
{
DLinkList DL = InitDLinkList(DL);
DL = CreatDLinkList2(DL);
//DL = CreatDLinkList1(DL);
cout<<"删除1号链表节点:"<<endl;
Delete(DL,1);
PrintDLinkList(DL);
Insert(DL,1);
PrintDLinkList(DL);
}