欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

双向链表的基本操作1

程序员文章站 2022-03-24 18:19:15
...
dlinklist.h

#pragma once

#include<stdio.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); 

/** 
 * * @brief 往指定位置之前插入一个元素 
 * */ 
 void DLinkListInsert(DLinkNode* pos, DLinkType value); 

 /** 
  * * @brief 往指定位置之后插入一个元素 
  * */
dlinklist.c
#include<stdio.h>
#include<stdlib.h>
#include"dlinklist.h"

void DLinkListPrintChar(DLinkNode* head,const char* msg)
{
    if(head == NULL)
    {
        printf("非法输入\n");
        return;
    }
    printf("[#####%s#####]\n",msg);
    DLinkNode* cur = head->next;
    for(;cur != head;cur = cur->next)
    {
        printf("[%c|%p]\t",cur->data,cur);
    }
    printf("\n");
    return;
}

DLinkNode* CreatDlinkNode(DLinkType value)
{
    DLinkNode* New_Node = (DLinkNode*)malloc(sizeof(DLinkNode));
    New_Node->data = value;
    New_Node->prev = NULL;
    New_Node->next = NULL;
    
    return New_Node;

}

void DLinkListInit(DLinkNode** head)
{
    if(head == NULL)
    {
        //error
        return;
    }
    *head = CreatDlinkNode(0);
    (*head)->prev = *head;
    (*head)->next = *head;
    return;
}

//尾插
void DLinkListPushBack(DLinkNode* head, DLinkType value)
{
    if(head == NULL)
    {
        //error;
        return;
    }
    DLinkNode* New_Node = CreatDlinkNode(value);
    New_Node->data = value;
    DLinkNode* tail = head->prev;
    tail->next = New_Node;
    New_Node->prev = tail;
    New_Node->next = head;
    head->prev = New_Node;
}

//尾删
void DLinkListPopBack(DLinkNode*head)
{
    if(head == NULL)
    {
        //error
        return;
    }
    if(head->next == NULL)
    {
        //空链表
        return;
    }
    DLinkNode* tailprev = head->prev->prev;
    free(tailprev->next);
    tailprev->next = head;
    head->prev = tailprev;
}



void DLinkListPushFront(DLinkNode* head,DLinkType value)
{
    if(head == NULL)
    {
        //error
        return;
    }
    DLinkNode* New_Node = CreatDlinkNode(value);
    New_Node->next = head->next;
    New_Node->next->prev = New_Node;
    head->next = New_Node;
    New_Node->prev = head;
}

void DLinkNodePopFront(DLinkNode* head)
{
    if(head == NULL)
    {
        //error
        return;
    }
    DLinkNode*Next = head->next;
    head->next = Next->next;
    Next->next->prev = Next->prev;
    free(Next);
}


DLinkNode* DLinkListFind(DLinkNode* head, DLinkType to_find)
{
    if(head == NULL)
    {
        //error
        return NULL;
    }
    DLinkNode* cur = head->next;
    while(cur != head)
    {
        if(cur->data == to_find)
        {
            return cur;
        }
        cur = cur->next;
    }
    return NULL;
}

void DLinkListInsert(DLinkNode* pos,DLinkType value)
{
    if(pos == NULL)
    {
        //error
        return;
    }
    DLinkNode* New_Node = CreatDlinkNode(value);
    New_Node->data = value;
    DLinkNode* Prev = pos->prev;
    Prev->next = New_Node;
    New_Node->prev = Prev;
    New_Node->next = pos;
    pos->prev = New_Node;
}

void DLinkListInsertAfter(DLinkNode* pos,DLinkType value)
{
    if(pos == NULL)
    {
        //error
        return;
    }
    DLinkNode* New_Node = CreatDlinkNode(value);
    New_Node->data = value;
    DLinkNode* Next = pos->next;
    Next->prev = pos;
    pos->next = New_Node;
    New_Node->prev = pos;
    New_Node->next = Next;
    Next->prev = New_Node;
}
void TestPushBack()
{
    DLinkNode* head;
    DLinkListInit(&head);
    DLinkListPushBack(head,'a');
    DLinkListPushBack(head,'b');
    DLinkListPushBack(head,'c');
    DLinkListPushBack(head,'d');
    DLinkListPrintChar(head,"尾插元素");
}

void TestPopBack()
{

    DLinkNode* head;
    DLinkListInit(&head);
    DLinkListPushBack(head,'a');
    DLinkListPushBack(head,'b');
    DLinkListPushBack(head,'c');
    DLinkListPushBack(head,'d');
    DLinkListPopBack(head);
    DLinkListPrintChar(head,"尾删元素");
}

void TestPushFront()
{
    
    DLinkNode* head;
    DLinkListInit(&head);
    DLinkListPushFront(head,'a');
    DLinkListPushFront(head,'b');
    DLinkListPushFront(head,'c');
    DLinkListPushFront(head,'d');
    DLinkListPrintChar(head,"头插元素");
}


void TestPopFront()
{
    DLinkNode* head;
    DLinkListInit(&head);
    DLinkListPushFront(head,'a');
    DLinkListPushFront(head,'b');
    DLinkListPushFront(head,'c');
    DLinkListPushFront(head,'d');
    DLinkNodePopFront(head);
    DLinkListPrintChar(head,"头删元素");
}

void TestInsert()
{
    DLinkNode* head;
    DLinkListInit(&head);
    DLinkListPushBack(head,'a');
    DLinkListPushBack(head,'b');
    DLinkListPushBack(head,'c');
    DLinkListPushBack(head,'d');
    DLinkNode* pos = DLinkListFind(head,'c');
    DLinkListInsert(pos,'x');
    DLinkListPrintChar(head,"前插元素");
}

void TestInsertAfter()
{
    DLinkNode* head;
    DLinkListInit(&head);
    DLinkListPushBack(head,'a');
    DLinkListPushBack(head,'b');
    DLinkListPushBack(head,'c');
    DLinkListPushBack(head,'d');
    DLinkNode* pos = DLinkListFind(head,'c');
    DLinkListInsertAfter(pos,'x');
    DLinkListPrintChar(head,"在c之后插入x");
    DLinkListInsertAfter(head,'w');
    DLinkListPrintChar(head,"在head在后插入w");
}

int main()
{
    TestPushBack();
    TestPopBack();
    TestPushFront();
    TestPopFront();
    TestInsert();
    return 0;
}