目录
双链表的结构
每一个数据结点有两个指针,一个pre指向前一个结点,next指向后一个结点
结构定义
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 = NULL;
L->next = NULL;
return L;
}
头插法
void headInsert(Node* L, int data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
if (L->data == 0) {
//链表为空,只用改变两个指针的指向
L->next = node;
node->next = NULL;
}
else {//改变四个指针
node->next = L->next;
node->pre = L;
L->next->pre = node;
L->next = node;
}
L->data++;
}
尾插法
void tailInsert(Node* L, int data) {
Node* node = (Node*)malloc(sizeof(Node));
Node* n = L;
while (n->next)
n = n->next;
node->data = data;
node->next = NULL;
node->pre = n;
n->next = node;
L->data++;
}
删除结点
void delete(Node* L, int data) {
Node* node = L->next;
while (node) {
if (node->data == data) {
node->pre->next = node->next;
if (node->next) {
node->next->pre = node->pre;
}
free(node);
L->data--;
break;
}
node = node->next;
}
}
打印链表
void printList(Node* L) {
Node* node = L->next;
while (node) {
printf("%d->", node->data);
node = node->next;
}
printf("NULL\n");
}
用于测试的主函数
int main() {
Node* L = initList();
headInsert(L, 1);
headInsert(L, 2);
headInsert(L, 3);
headInsert(L, 4);
headInsert(L, 5);
tailInsert(L, 6);
tailInsert(L, 7);
printList(L);
delete(L, 6);
delete(L, 2);
printList(L);
}