双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)

我们在单链表中,有了next指针,这就使得我们要查找下一个结点的时间复杂度为O(1),可是如果我们要查找的是上一个结点的话,那么最坏的时间复杂度为O(n)。因为我们每次都要从头开始遍历。

为了克服单向性这一缺点,双向链表就横空出示。双向链表是在单链表的每一个结点中再设置一个指向前驱结点的指针域。所以在双向链表中的所有结点都有两个指针域,一个指向直接后继,另一个指向其直接前驱。

下面分享一下我写的双向链表的综合操作。希望对大家有用。

双向链表的头插与尾插的区别:见下方图示

双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)_第1张图片
双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)_第2张图片

双向循环链表的综合操作

/********************************************************* - Copyright (C): 2016 - File name : bothwaylink.cpp - Author : - Zhaoxinan - - Date : 2016年04月19日 星期二 17时12分28秒 - Description : 双向循环链表的综合操作 * *******************************************************/
#include <iostream>
#include <cstdlib>

typedef struct node
{
    int num;
    struct node * prior;
    struct node * next;
}Node;

typedef Node * Link;

/*创建双向循环链表头节点*/
void create_link(Link *head)
{
    *head = new Node;
    (*head)->prior = *head;
    (*head)->next = *head;
}
/*双向循环链表的头插*/
void insert_head(Link *head, Link *newnode)
{    
    (*newnode)->next = (*head)->next;
    (*newnode)->prior = *head;
    (*head)->next = *newnode;
    (*newnode)->next->prior = *newnode;

}
/*双向循环链表的尾插*/
void insert_tail(Link *head, Link *newnode)
{
    (*newnode)->next = *head;
    (*newnode)->prior = (*head)->prior;
    (*head)->prior->next = (*newnode);
    (*head)->prior = (*newnode);
}
/*双向循环链表的中插 将数字1234插入到5后面*/
void insert_mind(int inum, Link *head, Link *newnode)   
{
    Link temp = (*head)->next;
    while (temp != *head)
    {
        if (temp->num == inum)
    {
            (*newnode)->next = temp;
            (*newnode)->prior = (temp)->prior;
            (temp)->prior->next = (*newnode);
            (temp)->prior = (*newnode);
    }
    temp = temp->next;
    }
}
/*双向循环链表的删除*/
void delete_link(int dnum, Link *head)
{
    Link temp = (*head)->next;
    Link ptr = *head;

    while(temp != *head)
    {
    if (temp->num == dnum)
    {
            ptr->next = temp->next;
        temp->next->prior = ptr;
        delete(temp);
        temp = NULL;
        break;
    }
    ptr = temp;
    temp = temp->next;
    }
}

/* 双向循环链表的逆序遍历 */
void res_link(Link *head)
{
    Link temp = (*head)->prior;

    while (temp != *head)
    {
    std::cout << "num = " << temp->num << std::endl;
    temp = temp->prior;
    }
}

/* 双向循环链表的顺序遍历 */
void dis_link(Link *head)
{
    Link temp = (*head)->next;

    while (temp != *head)
    {
    std::cout << "num = " << temp->num << std::endl;
    temp = temp->next;
    }
}


int main()
{
    using namespace std;

    Link head;
    Link newnode;

    create_link(&head);

    cout << "______________初始化插入_______________\n"; 
    for (int i = 0; i < 10; i++)
    {
        newnode = new Node;
    if (newnode == NULL)
    {
        cout << "new newnode error!" << endl;
        exit(1);
    }
    newnode->num = i;
    //insert_head(&head, &newnode); //头插
    insert_tail(&head, &newnode);             //尾插
    }
    cout << "双向循环链表的顺序遍历" << endl;
    dis_link(&head);
    cout << "双向循环链表的逆序遍历" << endl;
    res_link(&head);

    cout << "双向循环链表的中插,将1234插入到5后面" << endl;
    newnode = new Node;
    if (newnode == NULL)
    {
    cout << "new newnode2 error!" << endl;
    exit(1);
    }
    newnode->num = 1234;
    insert_mind(5, &head, &newnode);   //将数字1234插入到5后面
    dis_link(&head);

    cout << "双向循环链表的删除,删除6" << endl;
    delete_link(6, &head);
    dis_link(&head);

    return 0;
}

程序运行结果

双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)_第3张图片
双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)_第4张图片

你可能感兴趣的:(C++,链表,C语言,指针,双向循环链表综合操作)