双向链表相较于单链表的优势之处在于指针域多了个前驱指针。
因此可以避免在寻找某个结点时可以避免重最开始遍历,运行效率不高的情况。
结点类型的定义:
typedef struct LNode {//结点类型的定义
int data;//数据域
//指针域
struct LNode* prior;//前驱指针
struct LNode* next;//后驱指针
}LNode, * LinkList;
头部插入法:
LinkList f1(LinkList& L)//头部插入法
{
LNode* p, * r;//建立两个变量
L = (LNode*)malloc(sizeof(LNode));//L进行初始化
L->next = NULL;
L->prior = NULL;
r = L;//L赋值给r
int x;
cin >> x;//数据输入
while (x != 999)//当x为999时结束循环
{
p = (LNode*)malloc(sizeof(LNode*));
p->data = x;//数据域的输入
if (r->next == NULL)//第一次循环与后面的循环不同
{
r->next = p;
p->next = NULL;
p->prior = r;
}
else
{
r->next->prior = p;
p->next = r->next;
p->prior = r;
r->next = p;
}
cin >> x;
}
return L;
}
尾部插入法:
LinkList f2(LinkList& L)
{
L = (LNode*)malloc(sizeof(LNode));//L进行初始化
LNode* p, * r;//建立两个变量
L->next = NULL;
L->prior = NULL;
int x;
cin >> x;//数据输入
r = L;//L赋值给r
while (x != 999)//当x为999时结束循环
{
p = (LNode*)malloc(sizeof(LNode));
p->data = x;
r->next = p;
p->prior = r;
r = p;
cin >> x;
}
r->next = NULL;//给最后一个指针的后驱指针赋值成NULL
return L;
}