算法2-18~2-19:双向循环链表
来源:互联网 发布:红蜘蛛软件怎么退出 编辑:程序博客网 时间:2024/04/24 17:22
题目描述
双向链表是在结点中既保存了后一个结点指针又保存了前一个结点指针的链表。这种链表较单向链表而言能够快速查找某一结点的前后结点。下面给出双向链表的定义、插入以及删除算法描述。
图1:双向链表示例
(a)结点结构;(b)空的双向循环链表;(c)含有三个结点的双向循环链表
图2:双向链表的定义以及创建
双向链表在插入与删除时一定要注意其操作步骤的顺序。下面给出双向链表在插入与删除时的图示。
图3:双向链表插入与删除的图示
(a)双向链表的删除操作;(b)双向链表的插入操作
图4:双向链表的查找以及插入
图5:双向链表的删除操作
输入
输入数据只有一组,包含很多行。每行有1~3个整数。第一个整数如果是0,则表示输出双向链表中的所有元素;第一个整数如果是1,表示插入1个整数,其后跟2个整数i、e代表在第i个位置插入e;第一个整数如果是2,表示删除1个整数,其后跟1个整数i,表示删除的位置为i。
起始双向链表为空表。保证链表中每个元素不会重复,同时所有的操作都合法。
输出
当需要输出双向链表中的所有元素时输出,每次输出一行。整数间用一个空格隔开。
样例输入
1 1 2
0
1 2 7
0
2 1
0
1 2 4
1 3 5
1 2 6
0
2 3
0
样例输出
2
2 7
7
7 6 4 5
7 6 5
提示
提示:
1、如果使用switch,注意每个case后面使用break。
2、结构体定义时,因为定义里面有用到这个类型的指针,所以需要在开始struct后面写上结构体名。
3、注意循环链表全部遍历结束的条件是遍历的指针是否又指向了头结点。
总结:
1、双向链表的重要之处在于插入和删除时的操作顺序,切勿弄乱顺序而丢失数据。
2、循环链表全部遍历的结束条件需要注意,不是非空,而是判断是否到头结点了。
本题考查的是双向循环链表,所以上述都需要注意。
#include<iostream>#include<algorithm>struct Node{ int Data; struct Node* Prior; struct Node* Next;};void CreateHeadNode( struct Node* Head ){ Head->Data = 0, Head->Next = Head, Head->Prior = Head; return;}bool ListInsert( struct Node* Head, int Index, int Element ){ struct Node* TmpCell; TmpCell = static_cast<struct Node*> ( new struct Node ); TmpCell = Head->Next; int Count = 1; bool Flag = true; while( TmpCell != Head && Count < Index ) { TmpCell = TmpCell->Next; Count++; } if( TmpCell == Head && Count < Index ) { struct Node* NewNode = static_cast<struct Node*> ( new struct Node ); NewNode->Data = Element; NewNode->Prior = Head; NewNode->Next = Head; Head->Next = NewNode; Head->Prior = NewNode; } else if( Count > Index ) Flag = false; else { struct Node* NewNode = static_cast<struct Node*> ( new struct Node ); NewNode->Data = Element; NewNode->Next = TmpCell; NewNode->Prior = TmpCell->Prior; TmpCell->Prior->Next = NewNode; TmpCell->Prior = NewNode; Flag = true; } return Flag;}bool ListDelete( struct Node* Head, int Index, int& Element ){ struct Node* TmpCell = Head->Next; int Count = 1; bool Flag = true; while( TmpCell != Head && Count < Index ) { TmpCell = TmpCell->Next; Count++; } if( TmpCell == Head || Count > Index ) Flag = false; else { Element = TmpCell->Data; TmpCell->Prior->Next = TmpCell->Next; TmpCell->Next->Prior = TmpCell->Prior; delete( TmpCell ); } return Flag;}void OutputList( struct Node* Head ){ struct Node* TmpCell = Head->Next; while( TmpCell != Head ) { std::cout << TmpCell->Data; if( TmpCell->Next == Head ) std::cout << std::endl; else std::cout << " "; TmpCell = TmpCell->Next; } return;}int main( int argc, char **argv ){ int Operation; struct Node* Head; Head = static_cast<struct Node*> ( new struct Node ); CreateHeadNode( Head ); while( scanf( "%d", &Operation ) != EOF ) { switch( Operation ) { NumberOneIsOutput: case 0: { OutputList( Head ); break; } NumberTwoIsInsert: case 1: { int Index, Element; std::cin >> Index >> Element; ListInsert( Head, Index, Element ); break; }NumberThreeIsDelete: case 2: { int Index, Element; std::cin >> Index; ListDelete( Head, Index, Element ); break; } default:; } } return 0;}
- HNCU1328:算法2-18~2-19:双向循环链表
- 算法2-18~2-19:双向循环链表
- 数据结构高分笔记 算法2-18~2-19:双向循环链表
- HNCU 1328: 算法2-18~2-19:双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
- 面试题之两个队列实现一个栈
- node的模块系统
- POJ 3987 HDU 3695 Computer Virus on Planet Pandora AC自动机 -
- 关于Android --> MenuItem 长按出现Toast显示itemTitle的问题
- 算法2-18~2-19:双向循环链表
- (总结)关于Linux的缓存内存 Cache Memory详解
- [编程题] 数字翻转
- CSS文本对齐text-align详解
- 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
- 科技公司钟爱的50款开源工具--转载
- linux系统安装数据库时,xshell工具常用MySQL(5.5)相关命令
- 用MFC做漂亮界面之美化对话框
- CNN之权值共享的理解