双链表

//DLinkList.h
#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);
////DLinkList.c
#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);//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()
{
    //TestPushBack();
    //TestPopBack();
    //TestPushFront();
    //TestPopFront();
    //TestFind();
    //TestInsert();
    //TestInsertAfter();
    //TestLinkErase();
    //TestRemoveOne();
    //TestRemoveAll();
    //TestSize();
    TestIsEmpty();
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jsbgo201506010102/article/details/80589791