双向链表
1 双向链表的结构
注意typedef的定义结构,以及DinkList的数据类型
typedef struct DNode
{
int data; //数据域
struct DNode *prior,*next; //指针域
} DNode, *DinkList;
2 双向链表的创建
-2-1 头插法
注意插入第一个结点时,prior指针的空指向问题
if(L->next != NULL)//若L后继结点为空 则省略该步骤
L->next->prior = p;
基本代码
//头插法创建双向链表
DinkList HeadInvert_CreatDinkList(DinkList &L)
{
DNode *p;
int value;
L = new DNode;
L->next = NULL;
L->prior = NULL;
cout<<"Input: ";
while (cin>>value)
{
p = new DNode;
p->data = value;
//接入链表
p->next = L->next;
if(L->next != NULL)//若L后继结点为空 则省略该步骤
L->next->prior = p;
p->prior = L;
L->next = p;
cout<<"Input: ";
}
cin.clear();//清除输入流缓冲区
return L;
}
-2-2 尾插法创建双向链表
相比与头插法创建双向链表,更简便一些,在尾指针处稍加改动即可创建为循环双向链表
基本代码
//尾插法创建双向链表
DinkList TailInvert_CreatDinkList(DinkList &L)
{
DNode *p,*tail;//创建尾指针
int value;
L = new DNode;
L->next = NULL;
L->prior = NULL;
tail = L;
cout<<"Input: ";
while (cin>>value)
{
p = new DNode;
p->data = value; //赋值
p->freq = 0;
//接入链表
tail->next = p;
p->prior = tail;
tail = p;
cout<<"Input: ";
}
tail->next = NULL; //链表尾指向空
cin.clear();//清除输入流缓冲区
return L;
}
-2-3 尾插法创建循环双向链表
在尾插法创建双向链表的基础上,修改尾指针指向头节点即可
tail->next = L; //链表尾指向头节点