双向链表的基本操作

来源:互联网 发布:u盘检测工具 知乎 编辑:程序博客网 时间:2024/06/07 06:17

双向链表的建立,打印,查找,增删

#include <iostream>#include <vector>#include <algorithm>#include <string>#include <climits>using namespace std;//以下是关于双链表的操作struct dnode {    int data;    dnode* left;    dnode* right;    dnode() {        data = 0;        left = right = nullptr;    }    dnode(int d)    {        data = d;        left = right = nullptr;    }};//根据数据创建节点//插入新节点,总在表尾部插入;返回表头节点dnode* append_node(dnode* head, int data){    dnode* node = new dnode(data);    dnode* p = head, *q=nullptr;    while (p != nullptr)    {        q = p;        p = p->right;    }    q->right = node;    node->left = q;    return head;}dnode* creat_list(){    dnode* head = new dnode(0);    for (int i = 1; i < 10; i++)    {        head=append_node(head, i);    }    return head;//这就是已经创建好的链表的表头}//实现双链表的测长int get_length(dnode* head){    int cnt = 0;    dnode* pnode = head;    while (pnode != nullptr)    {        cnt++;        pnode = pnode->right;    }    return cnt;}//下面是打印整个链表、void print_list(dnode* head){    dnode* pnode = head;    if (head == nullptr)        return;    while (pnode != nullptr)    {        printf("%d ", pnode->data);        pnode = pnode->right;    }    printf("\n");}//双向链表的查找dnode* find_node(dnode* head, int data){    dnode* pnode = head;    if (head == nullptr)        return nullptr;    while ( pnode->data != data)    {        if(pnode->right != nullptr)        pnode=pnode->right;    }    return pnode;}//双向链表的插入:在节点node之后插入一个节点void insert_node(dnode* node, int data){    dnode* newnode = new dnode(data);    if (node->right == nullptr)//在结尾插入新节点    {        node->right = newnode;        newnode->left = node;    }    else//在中间的情况    {        newnode->right = node->right;        node->right->left = newnode;        node->right = newnode;        newnode->left = node;    }}//删除一个双向链表中的节点,返回表头节点,删除失效,返回nullptrdnode* delete_node(dnode* head, int data){    dnode* ptmp = nullptr;    dnode* pnode = find_node(head, data);    if (pnode == nullptr)        return nullptr;//没有找到要删除的节点,返回null    else if (pnode->left == nullptr)//找到的节点是首部节点    {        head = pnode->right;        if (head != nullptr)        {            head->left = nullptr;        }    }    else if (pnode->right == nullptr)//找到的节点是尾部节点    {        pnode->left->right = nullptr;    }    else//node为中间节点    {        pnode->left->right = pnode->right;        pnode->right->left = pnode->left;    }    return head;}int main() {    cout << "begin\n";    dnode* head=creat_list();    cout << "list length: " << get_length(head)<<endl;    print_list(head);    cout << "寻找特定节点:" << endl;    dnode* p = find_node(head, 4);    print_list(p);    cout << "在特定节点后插入一节点13" << endl;    insert_node(p, 13);    print_list(head);    cout << "删除特定的节点13" << endl;    head=delete_node(head, 13);    print_list(head);    }
0 0
原创粉丝点击