双向链表的基本操作
来源:互联网 发布: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
- 双向循环链表的基本操作
- 双向链表的基本操作
- 双向链表的基本操作
- 双向链表的基本操作
- 双向链表的基本操作
- 双向循环链表的基本操作
- 双向链表的基本操作
- 双向链表的基本操作
- 双向循环链表的基本操作
- 双向链表的基本操作
- 双向链表的基本操作
- 双向链表的基本操作
- 双向链表的基本操作实现
- 双向循环链表的基本操作
- 双向链表的基本操作
- 双向链表的基本操作
- 双向链表的基本操作-数据结构
- 双向链表的基本操作
- WinMain
- Flume 丢失数据问题
- 关于SpringAOP的初步认识(个人理解)
- Java设计模式之中介者模式
- 火柴棒等式
- 双向链表的基本操作
- C++中的4中类型转换方式
- 设计模式之装饰模式
- 排序算法总结--C++代码实现
- 遍历一个ul设置各个li不同的样式
- test3
- 重写
- centos7最小安装
- 程序的机器级表示·三