数据结构与算法分析——c语言描述 第三章的双链表
和单链表差不多,删除插入画个图就很形象了。
double_list.h
typedef int ElementType;
#ifndef _double_List_H
#define _double_List_H
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode DoubleList;
typedef PtrToNode Position;
DoubleList CreatList();
DoubleList MakeEmpty(DoubleList L);
int IsEmpty(DoubleList L);
int IsLast(Position P);
Position Find(ElementType X, DoubleList L);
void Delete_ElementType(ElementType X, DoubleList L);
void Delete_Position(Position p);
void Insert(ElementType X, Position P);
void DeleteList(DoubleList L);
Position Header(DoubleList L);
Position First(DoubleList L);
Position Advance(Position P);
Position Retreat(Position P);
ElementType Retrieve(Position P);
#endif
double_list.c
#include"doubleList.h"
#include<stdlib.h>
#include"fatal.h"
struct Node
{
ElementType Element;
Position Next;
Position Prev;
};
DoubleList CreatList() {
DoubleList l = malloc(sizeof(struct Node));
l->Prev = NULL;
l->Next = NULL;
return l;
}
DoubleList MakeEmpty(DoubleList L) {
if (L != NULL)
DeleteList(L);
L = malloc(sizeof(struct Node));
if (L == NULL)
FatalError("Out of memory");
L->Next = NULL;
L->Prev = NULL;
return L;
}
int IsEmpty(DoubleList L) {
return L->Next == NULL;
}
int IsLast(Position P) {
return P->Next == NULL;
}
Position Find(ElementType X, DoubleList L) {
Position P;
P = L->Next;
while (P != NULL&&P->Element != X)
{
P = P->Next;
}
return P;
}
void Delete_ElementType(ElementType X, DoubleList L) {
Position P;
P = Find(X, L);
Delete_Position(P);
}
void Delete_Position(Position p) {
if (p != NULL) {
Position last, next;
last = p->Prev;
next = p->Next;
last->Next = next;
if (!IsLast(p)) {
next->Prev = last;
}
free(p);
}
}
void Insert(ElementType X, Position P) {
Position tmpCell;
tmpCell = malloc(sizeof(struct Node));
if (tmpCell == NULL)
FatalError("Out of space!!");
Position temp = P->Next;
P->Next = tmpCell;
tmpCell->Next = temp;
tmpCell->Prev = P;
tmpCell->Element = X;
if (temp != NULL) {
temp->Prev = tmpCell;
}
}
void DeleteList(DoubleList L) {
Position p;
p = L->Next;
L->Next = NULL;
while (p != NULL) {
Position tmp;
tmp = p->Next;
free(p);
p = tmp;
}
}
Position Header(DoubleList L) {
return L;
}
Position First(DoubleList L) {
return L->Next;
}
Position Advance(Position P) {
return P->Next;
}
Position Retreat(Position P) {
return P->Prev;
}
ElementType Retrieve(Position P) {
return P->Element;
}