头文件(相关函数说明):
#pragma once
typedef struct DCNode
{
int data;
struct DCNode *prior;
struct DCNode *next;
}DCNode,*DCLinkList;
void InitLinkList(DCLinkList Head);
DCLinkList FindNode_Pos(DCLinkList Head,int pos);
int GetLength(DCLinkList Head);
void Insert(DCLinkList Head,int value,int pos);
void InsertHead(DCLinkList Head,int value);
void InsertTail(DCLinkList Head,int value);
void Delete(DCLinkList Head,int pos);
void DeleteHead(DCLinkList Head);
void DeleteTail(DCLinkList Head);
int IsEmpty(DCLinkList Head);
int GetLength(DCLinkList Head);
void ClearList(DCLinkList Head);
void Show(DCLinkList Head);
函数定义:
#include"DCLinkList.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
static DCLinkList _ApplyNode(DCLinkList prior,int data,DCLinkList next)
{
DCLinkList s = (DCLinkList)malloc(sizeof(DCNode));
if(s == NULL)
{
printf("Application for space node failed\n");
return NULL;
}
s->prior = prior;
s->data = data;
s->next = next;
return s;
}
void InitLinkList(DCLinkList Head)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("Init:HeadNode Is NULL\n");
return ;
}
Head->next = Head;
Head->prior = Head;
}
DCLinkList FindNode_Pos(DCLinkList Head,int pos)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("FindNode:HeadNode Is NULL\n");
return NULL;
}
if(pos < 0)
{
printf("FindNode:The Pos Location Is Illegal\n");
return NULL;
}
DCLinkList s = Head;
while (s->next != Head && pos )
{
s = s->next;
pos--;
}
if(pos == 0)
{
return s;
}
return NULL;//pos位置不合法
}
int GetLength(DCLinkList Head)
{
DCLinkList s = Head;
int length = 0;
while (s->next != Head)
{
length++;
}
return length;
}
void Insert(DCLinkList Head,int value,int pos)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("Insert:HeadNode Is NULL\n");
return ;
}
DCLinkList s = FindNode_Pos(Head,pos);
if(s == NULL)
{
printf("Insert:The Pos Location Is Illegal\n");
return;
}
DCLinkList p = _ApplyNode(s,value,s->next);
if(p == NULL)
{
printf("Insert:Apply NewNode Failed\n");
return;
}
s->next->prior = p;
s->next = p;
}
void InsertHead(DCLinkList Head,int value)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("InsertTail:HeadNode Is NULL\n");
return ;
}
Insert(Head,value,0);
}
void InsertTail(DCLinkList Head,int value)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("InsertTail:HeadNode Is NULL\n");
return ;
}
DCLinkList s = _ApplyNode(Head->prior,value,Head);
if(s == NULL)
{
printf("InsertTail:Apply NewNode Failed\n");
return;
}
Head->prior->next = s;
Head->prior = s;
}
void Delete(DCLinkList Head,int pos)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("Delete:HeadNode Is NULL\n");
return ;
}
DCLinkList s = FindNode_Pos(Head,pos);
if(s == NULL || s == Head)//头结点不能被删除
{
printf("Delete:The POS Location Is Illegal\n");
return;
}
s->next->prior = s->prior;
s->prior->next = s->next;
free(s);
}
void DeleteHead(DCLinkList Head)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("DeleteHead:HeadNode Is NULL\n");
return ;
}
Delete(Head,1);
}
void DeleteTail(DCLinkList Head)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("DeleteTail:HeadNode Is NULL\n");
return ;
}
if(IsEmpty(Head)) //链表为空时,不需要删除
{
printf("DeleteTail:Empty LinkList\n");
}
DCLinkList s = Head->prior;
Head->prior = s->prior;
s->prior->next = Head;
free(s);
}
int GetLength(DCLinkList Head)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("GetLength:HeadNode Is NULL\n");
return 1;
}
int length = 0;
DCLinkList s = Head;
while (s->next)
{
length++;
s = s->next;
}
}
int IsEmpty(DCLinkList Head)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("IsEmpty:HeadNode Is NULL\n");
return 1;
}
return Head->next == NULL;//头结点的下一个结点不为空
}
void ClearList(DCLinkList Head)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("IsEmpty:ClearList Is NULL\n");
return ;
}
while (!IsEmpty(Head))
{
DeleteHead(Head);
}
}
void Show(DCLinkList Head)
{
assert(Head != NULL);
if(Head == NULL)
{
printf("Show:HeadNode Is NULL\n");
return ;
}
DCLinkList s = Head;
while (s->next != Head)
{
s = s->next;
printf("%d-->",s->data);
}
printf("NULL\n");
}
主函数(测试):
#include<stdio.h>
#include"DCLinkList.h"
int main()
{
DCNode Head;
InitLinkList(&Head);
Insert(&Head,1,0);
Show(&Head);
InsertTail(&Head,100);
InsertTail(&Head,200);
Show(&Head);
//Delete(&Head,0);
DeleteTail(&Head);
DeleteHead(&Head);
Show(&Head);
return 0;
}