带头结点的双向链表
声明单链表结点类型
typedef struct DuLNode
{
int data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
操作
链表初始化
//链表初始化
void InitDuLinkList(DuLinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
plist->prior = plist->next = NULL;
}
为了实现以下插入,删除等一系列操作,先封装以下功能:
获取节点个数
int GetLength(DuLinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return -1;
}
int length = 0;
DuLinkList p = plist->next;
while(p != NULL)
{
length++;
p=p->next;
}
return length;
}
根据位置找结点
DuLinkList FindNodeOfPos(DuLinkList plist,int pos)
{
assert(plist != NULL);
if(plist == NULL || pos < 0)
{
return NULL;
}
DuLinkList p = plist;
while(pos && p != NULL)
{
p=p->next;
pos--;
}
return p;
}
申请节点
static DuLinkList _ApplyNode(int val,DuLinkList prior,DuLinkList next)
{
DuLinkList s = (DuLinkList)malloc(sizeof(DuLNode));
assert(s != NULL);
if (s == NULL)
{
printf("Insert Fail : Apply Spave Error\n");
return NULL;
}
s->data = val;
s->prior = prior;
s->next = next;
return s;
}
插入
1.新节点的prior和next
2.pos位置下一个节点的prior(特殊处理pos是最后一个节点)
3.pos未知节点的next
int Insert(DuLinkList plist,int val, int pos)
{
assert(plist != NULL);
if(plist == NULL)
{
return 0;
}
if(pos < 0 || pos > GetLength(plist))
{
return 0;
}
DuLinkList p = FindNodeOfPos(plist, pos);
DuLinkList s = _ApplyNode(val, p, p->next);
if(s == NULL)return -1;
if(p->next != NULL)
{
p->next->prior = s;
}
p->next = s;
return 1;
}
头插
int Insert_Head(DuLinkList plist,int val)
{
return Insert(plist, val ,0);
}
尾插
int Insert_Tail(DuLinkList plist,int val)
{
return Insert(plist, val ,GetLength(plist));
}
删除
1.pos位置的前一个节点的next
2.pos位置的后一个结点的prior,如果pos是最后一个结点,则不需要处理
3.将pos位置释放
void Delete(DuLinkList plist , int pos)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
DuLinkList p = FindNodeOfPos(plist,pos);
if(p == NULL || p == plist)return;
p->prior->next=p->next;
if(p->next != NULL)
{
p->next->prior = p->prior;
}
free(p);
}
头删
void Delete_Head(DuLinkList plist )
{
Delete(plist,1);
}
尾删
void Delete_Tail(DuLinkList plist)
{
Delete(plist,GetLength(plist));
}
判空
int ListEmpty(DuLinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return 1;
}
if(plist->next == NULL)
{
return 1;
}
return 0;
}
置空
void Clear(DuLinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return ;
}
while(!ListEmpty(plist))
{
Delete_Head(plist);
}
}
显示
void Show(DuLinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
DuLinkList p = plist->next;
while(p)
{
printf("%d ——> ",p->data);
p = p ->next;
}
printf("NULL\n");
}