#pragma once
#include<stddef.h>
typedef char DLinkType;
typedef struct DLinkNode {
DLinkType data;
struct DLinkNode* next;
struct DLinkNode* prev;
}DLinkNode;
void DLinkListInit(DLinkNode** head);
void DLinkListPushBack(DLinkNode* head,DLinkType value);
void DLinkListPopBack(DLinkNode* head);
void DLinkListPushFront(DLinkNode* head, DLinkType value);
void DLinkListPopFront(DLinkNode* head);
DLinkNode* DLinkListFind(DLinkNode* head,DLinkType to_find);
void DLinkListInsert( DLinkNode* pos, DLinkType value);
void DLinkListAfter(DLinkNode* pos, DLinkType value);
void DLinkListErase(DLinkNode* pos);
void DLinkListRemove(DLinkNode* head,DLinkType value);
void DLinkListRemoveAll(DLinkNode* head, DLinkType value);
int DLinkListSize(DLinkNode* head);
int DLinkList_Is_Empty(DLinkNode* head);
void DLinkListDestory(DLinkNode** head);
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"dlinklist.h"
DLinkNode* CreatNode(DLinkType value)
{
DLinkNode* pnew_node = (DLinkNode*)malloc(sizeof(DLinkNode));
pnew_node->data = value;
pnew_node->next = pnew_node;
pnew_node->prev = pnew_node;
return pnew_node;
}
void DestoryNode(DLinkNode* ptr)
{
free(ptr);
ptr = NULL;
}
void DLinkListInit(DLinkNode** head)
{
if (head == NULL)
{
return;
}
*head = CreatNode(0);
return;
}
void DLinkListPushBack(DLinkNode* head, DLinkType value)
{
if (head == NULL)
{
return;
}
DLinkNode* New_Node = CreatNode(value);
DLinkNode* New_Node_prev = head->prev;
DLinkNode* New_Node_next = head;
New_Node->next = New_Node_next;
New_Node->next->prev = New_Node;
New_Node->prev = New_Node_prev;
New_Node->prev->next = New_Node;
}
void DLinkListPopBack(DLinkNode* head)
{
if (head == NULL)
{
return;
}
if (head->next == head)
{
return;
}
DLinkNode* to_delet=head->prev;
DLinkNode* to_delet_prev = to_delet->prev;
DLinkNode* to_delet_next = to_delet->next;
to_delet_prev->next = to_delet_next;
to_delet_next->prev = to_delet_prev;
DestoryNode(to_delet);
}
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->next->prev = New_Node;
New_Node->prev = New_Node_prev;
New_Node_prev->next = New_Node;
}
void DLinkListPopFront(DLinkNode* head)
{
if (head == NULL)
{
return;
}
if (head->next == head)
{
return;
}
DLinkNode* to_delet = head->next;
DLinkNode* to_delet_next = to_delet->next;
DLinkNode* to_delet_prev = to_delet->prev;
to_delet_next->prev = to_delet_prev;
to_delet_prev->next = to_delet_next;
DestoryNode(to_delet);
}
DLinkNode* DLinkListFind(DLinkNode* head, DLinkType to_find)
{
if (head == NULL)
{
return 0;
}
DLinkNode* ptr = head->next;
for (; ptr != head; ptr = ptr->next)
{
if (ptr->data == to_find)
{
return ptr;
}
}
return NULL;
}
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->next = New_Node_next;
New_Node->next->prev = New_Node;
New_Node->prev = New_Node_prev;
New_Node_prev->next = New_Node;
}
void DLinkListAfter(DLinkNode* pos, DLinkType value)
{
if (pos == NULL)
{
return;
}
DLinkNode* New_Node = CreatNode(value);
DLinkNode* New_Node_next = pos->next;
DLinkNode* New_Node_prev = pos;
New_Node->next = New_Node_next;
New_Node->next->prev = New_Node;
New_Node->prev = New_Node_prev;
New_Node_prev->next = New_Node;
}
void DLinkListErase(DLinkNode* pos)
{
if (pos == NULL)
{
return;
}
DLinkNode* pos_next = pos->next;
DLinkNode* pos_prev = pos->prev;
pos_next->prev = pos_prev;
pos_prev->next = pos_next;
DestoryNode(pos);
}
void DLinkListRemove(DLinkNode* head, DLinkType value)
{
if (head == NULL)
{
return;
}
DLinkNode* cut = head->next;
for (;cut != head; cut = cut->next)
{
if (cut->data == value)
{
DLinkNode* to_delet_prev = cut->prev;
DLinkNode* to_delet_next = cut->next;
to_delet_prev->next = to_delet_next;
to_delet_next->prev = to_delet_prev;
DestoryNode(cut);
return;
}
}
return;
}
void DLinkListRemoveAll(DLinkNode* head, DLinkType value)
{
if (head == NULL)
{
return;
}
while (1)
{
DLinkNode* to_find=DLinkListFind(head,value);
if (to_find == NULL)
return;
DLinkListErase(to_find);
}
return;
}
int DLinkListSize(DLinkNode* head)
{
assert(head);
int size = 0;
DLinkNode* cur = head->next;
while (cur != head)
{
++size;
cur = cur->next;
}
return size;
}
int DLinkList_Is_Empty(DLinkNode* head)
{
if (head == NULL)
{
return -1;
}
if (head->next == head)
{
return 1;
}
return 0;
}
void DLinkListDestory(DLinkNode** head)
{
assert(head&&*head);
DLinkNode* cur = (*head)->next;
while (cur != *head)
{
DLinkNode* neat = cur->next;
DestoryNode(cur);
cur = neat;
}
DestoryNode(*head);
}
void PrintfList(DLinkNode* head)
{
DLinkNode* Node_next = head->next;
printf("[head]");
for (; Node_next != head; Node_next = Node_next->next)
{
printf(" -> [%c]:%p", Node_next->data, Node_next);
}
printf("\n");
DLinkNode* Node_prev = head->prev;
printf("[head]");
for (; Node_prev != head; Node_prev = Node_prev->prev)
{
printf(" -> [%c]:%p", Node_prev->data, Node_prev);
}
printf("\n");
}
void TestInit()
{
DLinkNode* head;
DLinkListInit(&head);
}
void TestPushBack()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head,'a');
DLinkListPushBack(head, 'b');
DLinkListPushBack(head, 'c');
DLinkListPushBack(head, 'd');
PrintfList(head);
}
void TestPopBack()
{
DLinkNode* head;
DLinkListInit(&head);
printf("尾插四个元素\n");
DLinkListPushBack(head, 'a');
DLinkListPushBack(head, 'b');
DLinkListPushBack(head, 'c');
DLinkListPushBack(head, 'd');
PrintfList(head);
DLinkListPopBack(head);
DLinkListPopBack(head);
printf("删除两个:\n");
PrintfList(head);
DLinkListPopBack(head);
DLinkListPopBack(head);
printf("再删除两个:\n");
PrintfList(head);
printf("删除空链表:\n");
DLinkListPopBack(head);
}
void TestPushFront()
{
DLinkNode* head;
DLinkListInit(&head);
printf("头插四个元素\n");
DLinkListPushFront(head, 'a');
DLinkListPushFront(head, 'b');
DLinkListPushFront(head, 'c');
DLinkListPushFront(head, 'd');
PrintfList(head);
}
void TestPopFront()
{
DLinkNode* head;
DLinkListInit(&head);
printf("尾插四个元素\n");
DLinkListPushBack(head, 'a');
DLinkListPushBack(head, 'b');
DLinkListPushBack(head, 'c');
DLinkListPushBack(head, 'd');
PrintfList(head);
printf("删除两个:\n");
DLinkListPopFront(head);
DLinkListPopFront(head);
PrintfList(head);
printf("再删除两个:\n");
DLinkListPopFront(head);
DLinkListPopFront(head);
PrintfList(head);
printf("删除空链表:\n");
DLinkListPopFront(head);
}
void TestFind()
{
DLinkNode* head;
DLinkListInit(&head);
printf("尾插四个元素\n");
DLinkListPushBack(head, 'a');
DLinkListPushBack(head, 'b');
DLinkListPushBack(head, 'c');
DLinkListPushBack(head, 'd');
PrintfList(head);
DLinkNode* test1 = DLinkListFind(head, 'c');
printf("%p\n", test1);
DLinkNode* test2 = DLinkListFind(head, 'v');
printf("%p\n", test2);
}
void TestInsert()
{
DLinkNode* head;
DLinkListInit(&head);
printf("头插四个元素\n");
DLinkListPushFront(head, 'a');
DLinkListPushFront(head, 'b');
DLinkListPushFront(head, 'c');
DLinkListPushFront(head, 'd');
PrintfList(head);
DLinkNode* test1 = DLinkListFind(head, 'c');
printf("在c前面插入x:\n");
DLinkListInsert(test1, 'x');
PrintfList(head);
}
void TestInsertAfter()
{
DLinkNode* head;
DLinkListInit(&head);
printf("头插四个元素\n");
DLinkListPushFront(head, 'a');
DLinkListPushFront(head, 'b');
DLinkListPushFront(head, 'c');
DLinkListPushFront(head, 'd');
PrintfList(head);
DLinkNode* test1 = DLinkListFind(head, 'c');
printf("在c后面面插入x:\n");
DLinkListAfter(test1, 'x');
PrintfList(head);
}
void TestLinkErase()
{
DLinkNode* head;
DLinkListInit(&head);
printf("头插四个元素\n");
DLinkListPushFront(head, 'a');
DLinkListPushFront(head, 'b');
DLinkListPushFront(head, 'c');
DLinkListPushFront(head, 'd');
PrintfList(head);
DLinkNode* test1 = DLinkListFind(head, 'c');
DLinkListErase(test1);
printf("删除c这个节点:\n");
PrintfList(head);
}
void TestRemoveOne()
{
DLinkNode* head;
DLinkListInit(&head);
printf("头插四个元素\n");
DLinkListPushFront(head, 'a');
DLinkListPushFront(head, 'b');
DLinkListPushFront(head, 'c');
DLinkListPushFront(head, 'd');
PrintfList(head);
printf("尾插四个元素\n");
DLinkListPushBack(head, 'w');
DLinkListPushBack(head, 'r');
DLinkListPushBack(head, 'y');
DLinkListPushBack(head, 'n');
PrintfList(head);
printf("删除r这个值的节点:\n");
DLinkListRemove(head, 'r');
PrintfList(head);
}
void TestRemoveAll()
{
DLinkNode* head;
DLinkListInit(&head);
printf("头插四个元素\n");
DLinkListPushFront(head, 'a');
DLinkListPushFront(head, 'r');
DLinkListPushFront(head, 'c');
DLinkListPushFront(head, 'r');
PrintfList(head);
printf("尾插四个元素\n");
DLinkListPushBack(head, 'w');
DLinkListPushBack(head, 'r');
DLinkListPushBack(head, 'y');
DLinkListPushBack(head, 'r');
PrintfList(head);
printf("删除r这个值的所有节点:\n");
DLinkListRemoveAll(head, 'r');
PrintfList(head);
}
void TestSize()
{
DLinkNode* head;
DLinkListInit(&head);
printf("头插四个元素\n");
DLinkListPushFront(head, 'a');
DLinkListPushFront(head, 'b');
DLinkListPushFront(head, 'c');
DLinkListPushFront(head, 'd');
PrintfList(head);
printf("尾插四个元素\n");
DLinkListPushBack(head, 'w');
DLinkListPushBack(head, 'r');
DLinkListPushBack(head, 'y');
DLinkListPushBack(head, 'n');
PrintfList(head);
int size = DLinkListSize(head);
printf("该链表长度为:%d\n", size);
}
void panduan(int ret)
{
if (ret == -1)
{
printf("传参非法\n");
return;
}
if (ret == 1)
{
printf("该链表为空\n");
return;
}
if (ret == 0)
{
printf("该链表不为空\n");
return;
}
}
void TestIsEmpty()
{
DLinkNode* head;
int ret1 = DLinkList_Is_Empty(NULL);
panduan(ret1);
DLinkListInit(&head);
int ret2 = DLinkList_Is_Empty(head);
panduan(ret2);
printf("头插四个元素\n");
DLinkListPushFront(head, 'a');
DLinkListPushFront(head, 'b');
DLinkListPushFront(head, 'c');
DLinkListPushFront(head, 'd');
PrintfList(head);
int ret3 = DLinkList_Is_Empty(head);
panduan(ret3);
}
int main()
{
TestIsEmpty();
system("pause");
return 0;
}