双循环链表
头节点的pre指向尾,尾节点的next指向pre
初始化链表
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct Node {
int data;
struct Node* pre;
struct Node* next;
} Node;
Node* initList() {
Node* L = (Node*)malloc(sizeof(Node));
L -> data = 0;
L -> pre = L;
L -> next = L;
return L;
}
int main()
{
Node* L = initList();
return 0;
}
增加节点
头插法
void headInsert(Node* L, data) {
Node* p = (Node*)malloc(sizeof(Node));
p -> data = data;
p -> next = L -> next;
p -> pre = L;
L -> next -> pre = p;
L -> next = p;
L -> data++;
}
尾插法
void tailInsert(Node* L, int data) {
Node* p = L;
while(p -> next != L) {
p = p -> next;
}
Node* n = (Node*)malloc(sizeof(Node));
n -> data = data;
p -> next = n;
n -> pre = p;
n -> next = L;
L -> pre = n;
L -> data++;
}
删除节点
int deleteList(Node* L, int data) {
Node* p = L -> next;
while(p != L) {
if (p -> data == data) {
if (p -> next != NULL) {
p -> pre -> next = p -> next;
p -> next -> pre = p -> pre;
} else p -> pre -> next = NULL;
L -> data--;
free(p);
return TRUE;
}
p = p -> next;
}
return FALSE;
}
遍历链表
void printList(Node* L) {
Node* p = L -> next;
while (p != L) {
printf("%d -> ", p -> data);
p = p -> next;
}
printf("NULL\n");
}