双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)
2016-04-19 20:39
696 查看
我们在单链表中,有了next指针,这就使得我们要查找下一个结点的时间复杂度为O(1),可是如果我们要查找的是上一个结点的话,那么最坏的时间复杂度为O(n)。因为我们每次都要从头开始遍历。
为了克服单向性这一缺点,双向链表就横空出示。双向链表是在单链表的每一个结点中再设置一个指向前驱结点的指针域。所以在双向链表中的所有结点都有两个指针域,一个指向直接后继,另一个指向其直接前驱。
下面分享一下我写的双向链表的综合操作。希望对大家有用。
双向链表的头插与尾插的区别:见下方图示
为了克服单向性这一缺点,双向链表就横空出示。双向链表是在单链表的每一个结点中再设置一个指向前驱结点的指针域。所以在双向链表中的所有结点都有两个指针域,一个指向直接后继,另一个指向其直接前驱。
下面分享一下我写的双向链表的综合操作。希望对大家有用。
双向链表的头插与尾插的区别:见下方图示
双向循环链表的综合操作
/********************************************************* - 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
- leetcode----最长有效括号字串
- 写一个类的构造函数、复制构造函数、析构函数、赋值函数
- [转]C++11 多线程
- C++之tinyXML使用
- C语言基本概念之空指针
- leetcode笔记:Integer Break
- leetcode88题 题解 翻译 C语言版 Python版
- C++ String转char*
- leetcode36题 题解 翻译 C语言版 Python版
- leetcode——largestRectangleArea
- [C语言][LeetCode][82]Remove Duplicates from Sorted List II
- hdoj1005
- [C语言][LeetCode][92]Reverse Linked List II
- [C语言][LeetCode][86]Partition List
- C语言单元测试框架Check
- Window下c++原始套接字来截包
- C++ 类的static成员
- C++ 类的“三法则”
- 关于C++中的友元函数的总结