数据结构-双链表 2021/8/6 0:22
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct DNode
{
ElemType data;
struct DNode* prior, * next;
}DNode,*DLinkList;
/*
* 双链表初始化(带头结点)
*/
bool InitDLinkList(DLinkList &L)
{
L = (DNode*)malloc(sizeof(DNode));
if (L == NULL)
return false;
L->prior = NULL;
L->next = NULL;
}
/*
* 双链表判空
*/
bool empty(DLinkList L)
{
if (L->next == NULL)
return false;
return true;
}
/*
* 双链表插入,在p结点后插入s结点
*/
bool InsertNextNode(DNode* p, DNode* s)
{
if (p == NULL || s == NULL)
return false;
s->prior = p;
s->next = p->next;
if(p->next!=NULL)
p->next->prior = s;
p->next = s;
return true;
}
/*
* 双链表的删除,删除p结点的下一个结点
*/
bool DeleteNextNode(DNode* p)
{
if (p==NULL)
return false;
DNode* q = p->next;
if (q == NULL)
return false;
p->next = q->next;
if(q->next!=NULL)
q->next->prior = p;
free(q);
return true;
}
/*
* 释放各个数据结点,删除双链表L
*/
bool DestoryList(DLinkList& L)
{
while (L->next != NULL)
DeleteNextNode(L);
free(L);
L=NULL;
return true;
}
1.初始化:初始化的时候注意要将prior和next指针都指空(而不是只将next指空)
2.判空:双链表的判空即判断头指针的next是否为NULL
3.双链表的插入:插入的时候注意前驱节点和后继结点的链接关系,在链接的时候注意判断当前是否为链表尾,若为链表尾,则无需将后面的结点的prior指向插入的结点
4.双链表的删除:注意链接关系和判断删除的结点是否是链表尾
5.删除链表L:利用4中的函数,不断删除头结点的next指向的结点
6.声明一个指针后要判断是否为空,防止出现内存不够分配失败的情况的情况!!!
考研加油!!!