带头节点的双向链表
DLinkList.h
#pragma once
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int DLinkType;
typedef struct DLinkNode {
DLinkType data;
struct DLinkNode* next;
struct DLinkNode* prev;
} DLinkNode;
void DLinkListInit(DLinkNode** head);//初始化链表
DLinkNode* DLinkListPushBack(DLinkNode* head, DLinkType value);//尾插数据
void DLinListPopBack(DLinkNode* head);//尾删
void DLinkListPushFront(DLinkNode* head, DLinkType value);//头插
void DLinkListPopFront(DLinkNode* head);//头删
DLinkNode* DLinkListFind(DLinkNode* head, DLinkType to_find);//查找数据
/**
* @brief 往指定位置之前插入一个元素
*/
void DLinkListInsert(DLinkNode* pos, DLinkType value);//在指定位置前插入数据
/**
* @brief 往指定位置之后插入一个元素
*/
void DLinkListInsertAfter(DLinkNode* pos, DLinkType value);//在指定位置之后插入数据
DLinkList.c
#include "DLinkList.h"
DLinkNode* CreatNode(DLinkType value){
DLinkNode *ptr = (DLinkNode*)malloc(sizeof(DLinkNode));
}
DLinkNode* DestroyNode(DLinkNode *ptr){
free(ptr);
}
void DLinkListInit(DLinkNode** head){ //初始化链表
if (*head == NULL){//未创建成功
return;
}
*head = CreatNode(0);
(*head)->next = *head;
(*head)->prev = *head;
}
DLinkNode* DLinkListPushBack(DLinkNode* head, DLinkType value){ //尾插数据
if (head == NULL){
return;//非法
}
DLinkNode* new_node=CreatNode(value);
DLinkNode* new_node_next = head;
DLinkNode* new_node_prev = head->prev;
new_node->next = new_node_next;
new_node_prev->next = new_node;
new_node_next->prev = new_node;
new_node->prev = new_node_prev;
return new_node;
}
void DLinListPopBack(DLinkNode* head){ //尾删
if (head == NULL){
return;
}
DLinkNode* to_delete = head->prev;
DLinkNode* to_delete_next = head;
DLinkNode* to_delete_prev = to_delete->prev;
to_delete_next->prev = to_delete_prev;
to_delete_prev->next = to_delete_next;
DestroyNode(to_delete);
}
void DLinkListPushFront(DLinkNode* head, DLinkType value){ //头插
if (head == NULL){
return;
}
DLinkNode* new_node = CreatNode(value);
DLinkNode* new_node_next = head->next;
DLinkNode* new_node_prev = head;
new_node->next = new_node_next;
new_node->prev = new_node_prev;
new_node_next->prev = new_node;
new_node_prev->next = new_node;
}
void DLinkListPopFront(DLinkNode* head){//头删
if (head == NULL){
return;
}
DLinkNode* to_delete = head->next;
DLinkNode* to_delete_prev = head;
DLinkNode* to_delete_next = to_delete->next;
to_delete_prev->next = to_delete_next;
to_delete_next->prev = to_delete_prev;
DestroyNode(to_delete);
}
DLinkNode* DLinkListFind(DLinkNode* head, DLinkType to_find){ //查找数据
if (head == NULL){
return;
}
DLinkNode* cur = head->next;
for (; cur != head; cur = cur->next){
if (cur->data == to_find)
return cur;
}
return NULL;
}
void DLinkListAfter(DLinkNode* pos, DLinkType value){ //在指定位置后插入数据
if (pos == NULL){
return;
}
DLinkNode* new_node = CreatNode(value);
DLinkNode* new_node_prev = pos;
DLinkNode* new_node_next = pos->next;
new_node_next->prev = new_node;
new_node_prev->next = new_node;
new_node->next = new_node_next;
new_node->prev = new_node_prev;
}
void DLinkListInsert(DLinkNode* pos, DLinkType value){ //在指定位置前插入数据
if (pos == NULL){
return;
}
DLinkNode* new_node = CreatNode(value);
DLinkNode* new_node_next = pos;
DLinkNode* new_node_prev = pos->prev;
new_node_prev->next = new_node;
new_node_next->prev = new_node;
new_node->next = new_node_next;
new_node->prev = new_node_prev;
}
//以下是测试代码
///
#define Test_Header printf("\n=========%s========\n",__FUNCTION__)
void DLinkListPrint(DLinkNode* head, const char* s){
printf("%s\n", s);
printf("[head]");
DLinkNode* cur = head->next;
for (; cur != head; cur = cur->next){
printf("->[ %d ]", cur->data);
}
printf("\n");
return;
}
void TestPushBack(){
Test_Header;
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head ,1);
DLinkListPushBack(head ,2);
DLinkListPushBack(head ,3);
DLinkListPushBack(head ,4);
DLinkListPrint(head, "尾插四个元素");
}
void TestPopBack(){
Test_Header;
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head, 1);
DLinkListPushBack(head, 2);
DLinkListPushBack(head, 3);
DLinkListPushBack(head, 4);
DLinkListPrint(head, "尾插四个元素");
DLinListPopBack(head, 3);
DLinListPopBack(head, 4);
DLinkListPrint(head, "尾删两个元素");
}
void TestPushFront(){
Test_Header;
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushFront(head ,1);
DLinkListPushFront(head ,2);
DLinkListPushFront(head ,3);
DLinkListPushFront(head ,4);
DLinkListPrint(head, "头插四个元素");
}
void TestPopFront(){
Test_Header;
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushFront(head, 1);
DLinkListPushFront(head, 2);
DLinkListPushFront(head, 3);
DLinkListPushFront(head, 4);
DLinkListPrint(head, "头插四个元素");
DLinkListPopFront(head, 4);
DLinkListPopFront(head, 3);
DLinkListPrint(head, "头删两个元素");
}
void TestFind(){
Test_Header;
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head, 1);
DLinkListPushBack(head, 2);
DLinkListPushBack(head, 3);
DLinkListPushBack(head, 4);
DLinkListPrint(head, "尾插四个元素");
int temp=DLinkListFind(head, 3);
//DLinkListPrint(head, "尾插四个元素");
printf("找到了:%d\n", temp);
}
void TestInsert(){
Test_Header;
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head, 1);
DLinkListPushBack(head, 2);
DLinkListPushBack(head, 3);
DLinkListPushBack(head, 4);
DLinkListInsert(2, 5);
DLinkListInsert(3, 6);
DLinkListPrint(head, "在指定位置前插入数据");
}
void TestAfter(){
Test_Header;
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head, 1);
DLinkListPushBack(head, 2);
DLinkListPushBack(head, 3);
DLinkListPushBack(head, 4);
DLinkListAfter(1, 5);
DLinkListAfter(2, 6);
DLinkListPrint(head, "在指定位置之后插入数据");
}
int main(){
TestPushBack();
TestPopBack();
TestPushFront();
TestPopFront();
TestFind();
TestInsert();
TestAfter();
return;
}