双向链表C语言描述
DuLinkList.h
#ifndef DULINKLIST_H
#define DULINKLIST_H
typedef unsigned char DuLElemType;
typedef struct DuLinkNode
{
DuLElemType data;
struct DuLinkNode* prior;
struct DuLinkNode* next;
} DuLinkNode;
typedef struct
{
DuLinkNode Head;
DuLinkNode* pTail;
int Length;
}DuLinkList;
void DuLinkList_Init(DuLinkList* L);
void DuLinkList_Append(DuLinkList* L,DuLElemType e);
void DuLinkList_Traverse(DuLinkList L);
void DuLinkList_ReTraverse(DuLinkList L);
DuLElemType DuLinkList_GetElem(DuLinkList L, int i);
DuLElemType DuLinkList_Delete( DuLinkList* L, int i);
void DuLinkList_Insert(DuLinkList* L, int i, DuLElemType e);
void DuDuLinkList_Clear(DuLinkList* L);
void DuLinkList_Test(void);
#endif
DuLinkList.c
#include "DuLinkList.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void DuLinkList_Init(DuLinkList* L)
{
L->Head.data = 0;
L->Head.prior = NULL;
L->Head.next = NULL;
L->pTail = &L->Head;
L->pTail->data = 0;
L->pTail->prior = NULL;
L->pTail->next = NULL;
L->Length = 0;
}
void DuLinkList_Append(DuLinkList* L,DuLElemType e)
{
DuLinkNode* NewNode = malloc(sizeof(DuLinkNode));
if (NewNode != NULL)
{
NewNode->data = e;
NewNode->next = NULL;
NewNode->prior = L->pTail;
L->pTail->next = NewNode;
L->pTail = NewNode;
L->Length += 1;
}
else
printf("申请内存失败!");
}
void DuLinkList_Traverse(DuLinkList L)
{
assert(L.Head.next != NULL);
DuLinkNode* p = L.Head.next;
while (p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
void DuLinkList_ReTraverse(DuLinkList L)
{
assert(L.Head.next != NULL);
DuLinkNode* p = L.pTail;
while (p != NULL)
{
printf("%c ", p->data);
p = p->prior;
}
printf("\n");
}
DuLElemType DuLinkList_GetElem(DuLinkList L,int i)
{
assert(L.Head.next != NULL);
int j;
DuLinkNode* p;
if (i >= 0)
{
assert(i < L.Length);
p = L.Head.next;
j = 0;
}
else
{
assert(i >= -L.Length);
p = L.pTail;
j = -1;
}
while (p != NULL)
{
if (i == j)
return p->data;
if (i >= 0)
{
p = p->next;
j++;
}
else
{
p = p->prior;
j--;
}
}
return 0;
}
DuLElemType DuLinkList_Delete(DuLinkList* L, int i)
{
assert(L->Head.next != NULL);
DuLinkNode* p;
unsigned int j;
if (i >= 0)
{
assert(i < L->Length);
p = L->Head.next;
j = 0;
}
else
{
assert(i >= -L->Length);
p = L->pTail;
j = -1;
}
while (p != NULL)
{
if (i == j)
{
DuLElemType e = p->data;
DuLinkNode* temp = p;
if (p == L->pTail)
{
L->pTail = p->prior;
}
else
{
temp->next->prior = temp->prior;
}
temp->prior->next = temp->next;
free(temp);
L->Length -= 1;
return e;
}
if (i >= 0)
{
p = p->next;
j++;
}
else
{
p = p->prior;
j--;
}
}
return 0;
}
void DuLinkList_Insert(DuLinkList* L, int i, DuLElemType e)
{
assert(L->Head.next != NULL);
DuLinkNode* p;
unsigned int j;
if (i >= 0)
{
assert(i < L->Length);
p = L->Head.next;
j = 0;
}
else
{
assert(i >= -L->Length);
p = L->pTail;
j = -1;
}
while (p != NULL)
{
if (j == i)
{
DuLinkNode* NewNode = malloc(sizeof(DuLinkNode));
if (NewNode != NULL)
{
NewNode->data = e;
NewNode->prior = p->prior;
NewNode->next = p;
p->prior->next = NewNode;
p->prior = NewNode;
L->Length += 1;
break;
}
else
printf("申请内存不足!");
}
if (i >= 0)
{
p = p->next;
j++;
}
else
{
p = p->prior;
j--;
}
}
}
void DuDuLinkList_Clear(DuLinkList* L)
{
assert(L->Head.next != NULL);
DuLinkNode* temp;
while (L->Head.next != NULL)
{
temp = L->Head.next;
L->Head.next = temp->next;
free(temp);
}
L->pTail = &L->Head;
}
void DuLinkList_Test(void)
{
DuLinkList L;
DuLinkList_Init(&L);
DuLinkList_Append(&L,'A');
DuLinkList_Append(&L, 'B');
DuLinkList_Append(&L, 'C');
DuLinkList_Append(&L, 'D');
DuLinkList_Traverse(L);
DuLinkList_ReTraverse(L);
DuLinkList_Insert(&L, -4, 'b');
DuLinkList_Traverse(L);
DuLinkList_ReTraverse(L);
printf("%c\n", DuLinkList_GetElem(L,-5));
printf("%c\n", DuLinkList_Delete(&L, -5));
DuLinkList_Append(&L, 'E');
DuLinkList_Traverse(L);
DuLinkList_ReTraverse(L);
DuDuLinkList_Clear(&L);
DuLinkList_Traverse(L);
}
测试:main.c文件
# include <stdio.h>
#include "DuLinkList.h"
int main()
{
DuLinkList_Test();
return 0;
}
测试结果:
![DuLinkList_Test](https://i-blog.csdnimg.cn/blog_migrate/9121fc96291eaf8465768a3a2ad77dc0.png)