双向循环链表list

合集下载

数据结构中linklist的理解

数据结构中linklist的理解

数据结构中linklist的理解LinkList(链表)的理解。

在数据结构中,链表(LinkList)是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

链表是一种线性数据结构,它可以用来表示一系列元素的顺序。

与数组不同,链表中的元素在内存中不是连续存储的,而是通过指针相互连接起来的。

这种特性使得链表具有一些独特的优势和应用场景。

链表的基本结构。

链表由节点组成,每个节点包含两部分,数据和指针。

数据部分用来存储元素的值,指针部分用来指向下一个节点。

链表的第一个节点称为头节点,最后一个节点称为尾节点,尾节点的指针指向空值(NULL)。

链表的分类。

链表可以分为单向链表、双向链表和循环链表三种基本类型。

单向链表,每个节点只包含一个指针,指向下一个节点。

双向链表,每个节点包含两个指针,分别指向前一个节点和后一个节点。

循环链表,尾节点的指针指向头节点,形成一个闭环。

不同类型的链表适用于不同的场景,选择合适的链表类型可以提高数据操作的效率。

链表的优势。

链表相对于数组有一些明显的优势:插入和删除操作高效,由于链表中的元素不是连续存储的,插入和删除操作可以在常数时间内完成,而数组中的插入和删除操作需要移动大量元素,时间复杂度为O(n)。

动态扩展,链表的大小可以动态调整,不需要预先分配固定大小的内存空间。

链表的应用场景。

由于链表的优势,它在一些特定的应用场景中得到了广泛的应用:LRU缓存,链表可以用来实现LRU(Least Recently Used)缓存淘汰算法,当缓存空间不足时,链表可以高效地删除最久未使用的元素。

大整数运算,链表可以用来表示大整数,实现大整数的加减乘除运算。

图论算法,在图论算法中,链表常常用来表示图的邻接表,用于表示图中的顶点和边的关系。

链表的实现。

链表的实现可以使用指针或者引用来表示节点之间的关系。

在C语言中,可以使用指针来表示节点之间的连接关系;在Java等语言中,可以使用引用来表示节点之间的连接关系。

c语言中linklist类型

c语言中linklist类型

c语言中linklist类型LinkList类型是C语言中常用的数据结构之一,它是一种线性链表的实现方式。

在计算机科学中,链表是一种常见的数据结构,用于存储和操作一系列元素。

链表由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

链表中的第一个节点称为头节点,最后一个节点称为尾节点。

链表可以根据需要动态地增加或删除节点,相比于数组,链表的大小可以根据实际需求进行调整。

链表的实现可以使用不同的方式,其中最常见的是单向链表。

在单向链表中,每个节点只有一个指针,指向下一个节点。

这种实现方式简单且高效,适用于大多数场景。

除了单向链表,还有双向链表和循环链表等其他实现方式。

链表的优点是可以快速在任意位置插入或删除节点,而无需移动其他节点。

这是由于链表中的节点通过指针相互连接,而不是像数组那样连续存储。

另外,链表的大小可以根据需要进行动态调整,而数组的大小是静态的。

这使得链表在处理动态数据集合时非常有用。

然而,链表也有一些缺点。

首先,访问链表中的任意节点都需要从头节点开始遍历,直到找到目标节点。

这导致了链表的访问时间复杂度为O(n),而数组的访问时间复杂度为O(1)。

其次,链表需要额外的内存空间来存储指针信息,这会占用更多的存储空间。

在C语言中,可以使用结构体来定义链表节点,例如:```typedef struct Node {int data;struct Node *next;} Node;typedef struct LinkedList {Node *head;Node *tail;} LinkedList;```上述代码定义了一个包含数据和指针的节点结构体Node,以及一个包含头节点和尾节点指针的链表结构体LinkedList。

通过这样的定义,可以方便地进行链表的操作,比如插入、删除和遍历等。

链表的插入操作可以分为三步:创建新节点、修改指针、更新链表的头尾指针。

例如,插入一个新节点到链表末尾的代码如下:```void insert(LinkedList *list, int data) {Node *newNode = (Node *)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;if (list->head == NULL) {list->head = newNode;list->tail = newNode;} else {list->tail->next = newNode;list->tail = newNode;}}```链表的删除操作也类似,可以分为三步:找到目标节点、修改指针、释放内存。

lst的分类 -回复

lst的分类 -回复

lst的分类-回复分类是一种重要的组织和整理信息的方式,可以帮助我们更好地理解事物之间的关系和相互作用。

在计算机科学领域,一个常见的数据结构是链表(List),它在不同的应用程序和算法中发挥着重要作用。

本文将围绕着链表的分类展开,深入探讨链表的不同类型和其特点。

链表是一种线性数据结构,由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

链表的分类可以从多个角度进行,下面将从以下五个方面详细介绍:1. 单链表(Singly Linked List)单链表是最基本的链表类型,它的每个节点只包含一个指向下一个节点的指针。

链表的第一个节点称为头节点,最后一个节点指向null。

单链表的插入和删除操作比较高效,但是访问效率较低,需要从头节点开始逐个遍历。

2. 双向链表(Doubly Linked List)双向链表在单链表的基础上增加了一个指向前一个节点的指针。

这样就可以从任一方向遍历链表,提高了访问效率。

双向链表的插入和删除操作也相对单链表更加复杂,因为需要更新前后节点的指针。

3. 循环链表(Circular Linked List)循环链表是一种特殊的链表类型,它的最后一个节点指向链表的第一个节点,形成一个闭环。

循环链表可以通过插入和删除操作来实现各种环形数据结构,如循环队列和循环缓冲区。

4. 带头节点的链表带头节点的链表是在链表的开头添加一个特殊的节点,即头节点,它的数据域为空。

头节点的存在可以简化链表的插入和删除操作,避免对链表的第一个节点做特殊处理。

5. 带环链表(Cyclic Linked List)带环链表是一种特殊的链表类型,其中至少有一个节点的指针指向链表中的某个节点,形成环。

带环链表的主要应用是解决一些循环结构相关的问题,如判断链表是否有环,寻找环的入口等。

以上是常见的几种链表分类,每种分类都有自己的特点和应用场景。

在实际应用中,根据具体的需求和问题,我们可以选择合适的链表类型来存储和操作数据。

双向链表练习题

双向链表练习题

双向链表练习题双向链表(Doubly Linked List)是一种常见的数据结构,它在单链表的基础上扩展,允许链表中的节点同时指向前一个节点和后一个节点。

在这篇文章中,我们将介绍几个双向链表的练习题,帮助读者更好地理解和掌握双向链表的操作。

1. 实现双向链表的节点类首先,我们需要定义一个双向链表的节点类。

节点类包括一个存储值的属性和两个指针属性,分别指向前一个节点和后一个节点。

以下是一个示例代码:```class DLLNode:def __init__(self, value):self.value = valueself.prev = Noneself.next = None```2. 在双向链表的尾部插入节点在双向链表中,可以在链表的尾部插入一个新的节点。

例如,如果链表中已有节点A和B,我们需要在B后插入一个新节点C。

以下是一个示例代码:```def insert_at_end(head, value):new_node = DLLNode(value)if head is None:head = new_nodeelse:current = headwhile current.next is not None:current = current.nextcurrent.next = new_nodenew_node.prev = currentreturn head```3. 删除双向链表中的节点双向链表允许从链表中删除指定节点。

我们可以根据节点的值或位置进行删除操作。

以下是一个根据节点值删除节点的示例代码:```def delete_node(head, value):current = headwhile current is not None:if current.value == value:if current.prev is not None:current.prev.next = current.nextif current.next is not None:current.next.prev = current.previf current == head:head = current.nextreturn headcurrent = current.nextreturn head```4. 查找双向链表中的节点可以根据节点值或位置在双向链表中查找节点。

list_for_each_entry_safe 原理

list_for_each_entry_safe 原理

list_for_each_entry_safe 原理`list_for_each_entry_safe` 是 Linux 内核源码中双向链表的遍历函数,用于遍历链表中的元素。

它的原型定义如下:```c#define list_for_each_entry_safe(pos, n, head, member) \for (pos = list_entry((head)->next, typeof(*pos), member), \n = list_entry(pos->member.next, typeof(*pos), member); \&pos->member != (head); \pos = n, n = list_entry(n->member.next, typeof(*n), member)) ```该宏定义了一个`for` 循环,用于迭代双向链表中的每个元素。

- `pos`:指向当前遍历到的元素的指针;- `n`:指向下一个待遍历的元素的指针;- `head`:链表头指针;- `member`:链表节点结构体中用来表示链表节点的成员变量名。

具体原理:1. 初始化 `pos` 和 `n`,将它们设置为链表中的第一个元素和第二个元素;2. 使用 `offsetof` 宏将 `pos` 转换为对应的链表节点结构体指针;3. 判断当前遍历的节点是否为链表头,如果是,则跳出循环,否则进入循环体;4. 更新 `pos` 和 `n`,将它们分别设置为下一个待遍历的元素和再下一个待遍历的元素;5. 在循环体中,对当前节点执行迭代操作。

通过这样的迭代操作,可以将链表中的每个元素都遍历一遍。

此外,`list_for_each_entry_safe` 与 `list_for_each_entry` 的区别在于前者在迭代过程中可以安全地删除链表节点(使用`list_del` 函数),而后者不具备删除节点的能力。

数据结构基本英语词汇

数据结构基本英语词汇

数据结构基本英语词汇数据抽象data abstraction数据元素data element 数据对象data object数据项data item 数据类型data type抽象数据类型abstract data type逻辑结构logical structure物理结构phyical structure 线性结构linear structure非线性结构nonlinear structure 基本数据类型atomic data type固定聚合数据类型fixed-aggregate data type 线性表linear list可变聚合数据类型variable-aggregate data type 栈stack队列queue 串string 数组array 树tree 图grabh查找,线索searching 更新updating 排序(分类) sorting插入insertion 删除deletion 前趋predecessor 后继successor直接前趋immediate predecessor 直接后继immediate successor双端列表deque(double-ended queue) 循环队列cirular queue指针pointer 先进先出表(队列)first-in first-out list 栈定top后进先出表(队列)last-in first-out list 栈底bottom 压入push弹出pop 队头front 队尾rear 上溢overflow 下溢underflow 数组array 矩阵matrix 多维数组multi-dimentional array以行为主的顺序分配row major order 三角矩阵truangular matrix以列为主的顺序分配column major order 对称矩阵symmetric matrix稀疏矩阵sparse matrix 转置矩阵transposed matrix 链表linked list线性链表linear linked list 单链表single linked list 多重链表multilinked list 循环链表circular linked list 双向链表doubly linked list 链link十字链表orthogonal list 广义表generalized list 指针域pointer field链域link field 头结点head node 头指针head pointer 尾指针tail pointer 串string 空白(空格)串blank string 空串(零串)null string子串substring 树tree 子树subtree 森林forest 根root叶子leaf 结点node 深度depth 层次level 双亲parents孩子children 兄弟brother 祖先ancestor 子孙descentdant二叉树binary tree 平衡二叉树banlanced binary tree 有序数ordered tree满二叉树full binary tree 完全二叉树complete binary tree遍历二叉树traversing binary tree 二叉排序树binary sort tree二叉查找树binary search tree 线索二叉树threaded binary tree哈夫曼树Huffman tree 无序数unordered tree 判定树decision tree 双链树doubly linked tree 数字查找树digital search tree树的遍历traversal of tree 先序遍历preorder traversal中序遍历inorder traversal 后序遍历postorder traversal图graph 子图subgraph 有向图digraph(directed graph)无向图undigraph(undirected graph) 完全图complete graph连通图connected graph 非连通图unconnected graph强连通图strongly connected graph 弱连通图weakly connected graph加权图weighted graph 有向无环图directed acyclic graph 边edge稀疏图spares graph 稠密图dense graph 重连通图biconnected graph 二部图bipartite graph 顶点vertex 弧arc 路径path 回路(环)cycle 弧头head 弧尾tail 源点source 终点destination 汇点sink权weight 连接点articulation point 初始结点initial node终端结点terminal node 相邻边adjacent edge 相邻顶点adjacent vertex 关联边incident edge 入度indegree 出度outdegree最短路径shortest path 有序对ordered pair 无序对unordered pair 简单路径simple path简单回路simple cycle 连通分量connected component邻接矩阵adjacency matrix 邻接表adjacency list邻接多重表adjacency multilist 遍历图traversing graph生成树spanning tree 最小(代价)生成树minimum(cost)spanning tree 生成森林spanning forest 拓扑排序topological sort偏序partical order 拓扑有序topological orderAOV网activity on vertex network AOE网activity on edge network关键路径critical path 匹配matching 最大匹配maximum matching增广路径augmenting path 增广路径图augmenting path graph查找searching 线性查找(顺序查找)linear search (sequential search)二分查找binary search 分块查找block search 散列查找hash search 平均查找长度average search length 散列表hash table散列函数hash funticion 直接定址法immediately allocating method数字分析法digital analysis method 平方取中法mid-square method折叠法folding method 除法division method 外部排序external sort 随机数法random number method 排序sort 内部排序internal sort 插入排序insertion sort 随小增量排序diminishing increment sort选择排序selection sort 堆排序heap sort 快速排序quick sort归并排序merge sort 基数排序radix sort 外部排序external sort 平衡归并排序balance merging sort 文件file 主文件master file二路平衡归并排序balance two-way merging sort多步归并排序ployphase merging sort置换选择排序replacement selection sort顺序文件sequential file 索引文件indexed file索引顺序文件indexed sequential file索引非顺序文件indexed non-sequential file直接存取文件direct access file多重链表文件multilist file 倒排文件inverted file。

list的种类

list的种类

list的种类在计算机科学领域中,list(列表)是一种存储有序且可变数量数据的数据结构。

但是,有许多种不同类型的列表可用于不同的编程需求。

下面是有关几种常用列表的详细信息。

1. 数组列表(Array List)数组列表是可以动态调整大小的数组。

这种列表的大小可以自动扩展或收缩,以适应不同的数据要求。

由于数组列表直接使用了数组,因此访问元素的速度很快。

不过,在列表的开始或中间插入或删除元素时,数组列表的效率较低。

2. 链表(Linked List)链表是许多小块内存组成的数据结构,每个块都包含一个指向下一个块的指针。

与数组列表不同,插入和删除元素时,链表的效率很高。

但是,要访问链表中的特定元素可能需要遍历整个列表。

3. 双向链表(Doubly Linked List)在双向链表中,每个节点既有向前(prev)指针,也有向后(next)指针。

这种列表的访问和插入/删除元素的效率比链表高,因为双向链表允许前向和后向遍历。

4. 栈(Stack)栈是一种后进先出(LIFO)数据结构,只能在表的顶部插入和删除元素。

栈可以使用链表或数组列表实现。

5. 队列(Queue)队列是一种先进先出(FIFO)数据结构,只能在表的一端插入元素(称之为“队尾”),在另一端删除元素(称之为“队首”或“头部”)。

队列也可以使用链表或数组列表实现。

6. 优先队列(Priority Queue)优先队列是一种具有特定优先级值的列表,它允许我们以优先级的高低来访问和删除元素。

优先队列可以通过链表、堆或二叉搜索树来实现。

7. 哈希表(Hash Table)哈希表是一种使用键值对(key-value pairs)来组织和存储数据的数据结构。

哈希表的插入、查找和删除操作都非常高效。

通常,哈希表的底层实现是数组列表或链表。

列表在计算机科学中扮演着至关重要的角色,因为它们可以帮助我们管理和操作数据。

通过选择合适的列表类型,我们可以确保我们的代码在时间和空间效率上具有最佳性能。

list_for_each_safe的用法

list_for_each_safe的用法

list_for_each_safe的用法list_for_each_safe是Linux内核中的一个宏,用于在遍历一个双向链表时确保遍历过程中的链表修改不会导致出现问题。

在本文中,将详细讨论list_for_each_safe的使用方法以及相关的背景知识。

1. 引言(介绍链表和链表遍历的重要性)链表是计算机科学中常用的数据结构之一,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

链表的遍历是对链表中的每个元素进行操作或访问的过程。

在操作系统中,特别是在Linux内核中,链表的使用非常广泛。

因此,高效且线程安全的链表遍历方法变得至关重要。

2. 理解安全遍历的需求链表是一个动态数据结构,在遍历链表时,可能会有其他线程或处理器修改链表的结构,比如添加、删除或移动节点。

如果不采取措施来处理这种情况,就可能导致指针丢失或访问无效的节点。

这对于操作系统内核来说是一个严重的问题,因为它们需要保证数据的一致性和稳定性。

list_for_each_safe宏就是为了解决这个问题而设计的。

3. list_for_each_safe的定义和参数在Linux内核源代码中,list_for_each_safe的定义如下:c#define list_for_each_safe(pos, n, head) \for (pos = list_first_entry(head, typeof(*pos), member), \ n = list_next_entry(pos, member); \&pos->member != (head); \pos = n, n = list_next_entry(n, member))在这个宏中,pos表示当前遍历节点的指针,n表示pos的下一个节点的指针,head是链表的头节点。

4. list_for_each_safe的实现原理list_for_each_safe的实现原理非常巧妙。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素。

在STL 中,list和vector 一样,是两个常被使用的容器。

和vector不一样的是,list不支持对元素的任意存取。

list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front、pop_front,这是vector不具备的。

禾口vector另一点不同的是,list的迭代器不会存在失效的情况,他不像vector会保留备份空间,在超过容量额度时重新全部分配内存,导致迭代器失效;list没有备份空间的概念,出入一个元素就申请一个元素的空间,所以它的迭代器不会失效。

还是举《C++之vector》中的例子:int data[6]={3,5,7,9,2,4};list< int> lidata(data, data+6);lidata.push_back(6);list初始化时,申请的空间大小为6,存放下了data中的6个元素,当向lidata插入第7个元素“6”,list申请新的节点单元,插入到list链表中,数据存放结构如图1所示:插入节点"6拆之后的list图1 list的存储结构list每次增加一个元素,不存在重新申请内存的情况,它的成本是恒定的。

而vector每当增加关键元素的时候,都需要重新申请新的更大的内存空间,会调用元素的自身的复制构造函数,存在构造成本。

在销毁旧内存的时候,会调用析构函数, 存在析构成本。

所以在存储复杂类型和大量元素的情况下,list比vector更有优势!List是一个双向链表,双链表既可以向前又向后链接他的元素。

List将元素按顺序储存在链表中.与向量(vector)相比,它允许快速的插入和删除,但是随机访问却比较慢。

assign()给list 赋值back()返回最后一个元素begin()返回指向第一个元素的迭代器clear()删除所有元素empty() 如果list是空的则返回trueen d()返回末尾的迭代器erase()删除一个元素fron t() 返回第一个元素get_allocator() 返回list 的配置器insert() 插入一个元素到list中max_size() 返回list能容纳的最大元素数量merge() 合并两个listpop_back() 删除最后一个元素pop_fro nt() 删除第一个元素push_back() 在list的末尾添加一个元素push_front() 在list的头部添加一个元素rbegi n() 返回指向第一个元素的逆向迭代器remove() 从list删除元素remove_if() 按指定条件删除元素rend()指向list末尾的逆向迭代器resize。

改变list的大小reverse。

把list的元素倒转size()返回list中的元素个数sort()给list 排序splice() 合并两个listswap() 交换两个listunique() 删除list中重复的元素List使用实例1#in elude <iostream>#in clude <list>#in clude <nu meric>#i nclude <algorithm>using n amespace std;〃创建一个list容器的实例LISTINT typedef list<int> LISTINT; 〃创建一个list容器的实例LISTCHAR typedef list<char> LISTCHAR;int main (i nt argc, char *argv[]){// -------------------------//用list容器处理整型数据// -------------------------〃用LISTINT创建一个名为listOne的list对象LISTINT list One;//声明i为迭代器LISTINT::iterator i;〃从前面向listOne容器中添加数据listO ne.push_fro nt (2);listO ne.push_fro nt (1);〃从后面向listOne容器中添加数据list On e.push_back (3);listO ne.push_back (4);〃从前向后显示listOne中的数据cout<<"list On e.beg in()--- list On e.e nd():"«e ndl;for (i = list On e.begi n(); i 匸list On e.e nd(); ++i) cout << *i << "";cout << en dl;〃从后向后显示listOne中的数据LISTINT::reverse_iterator ir;cout<<"listOne.rbegin()---list On e.re nd():"v<e ndl; for (ir =list On e.rbeg in (); ir!=list On e.re nd();ir++) { cout << *ir << "";}cout << en dl;〃使用STL的accumulate(累加)算法int result = accumulate(list On e.beg in(), list On e.e nd(),0); cout«"Sum二"vvresultvve ndl;cout«" --------------------- "<<e ndl;// -------------------------//用list容器处理字符型数据// -------------------------〃用LISTCHAR创建一个名为list One的list对象LISTCHAR listTwo;//声明i为迭代器LISTCHAR::iterator j;//从前面向listTwo容器中添加数据listTwo.push_fro nt ('A');listTwo.push_fro nt ('B');//从后面向listTwo容器中添加数据listTwo.push_back ('x'); listTwo.push_back ('y');〃从前向后显示listTwo中的数据cout«"listTwo.begin()---listTwo.e nd():"v<e ndl;for (j = listTwo.begin(); j != listTwo.end(); ++j)cout << char(*j) << "";cout << en dl;〃使用STL的max_element算法求listTwo中的最大元素并显示j=max_eleme nt(listTwo.begi n( ),listTwo.e nd());cout << "The maximum eleme nt in listTwo is: "v<char(*j)v<e ndl;return 0;}List使用实例2list: Lin ked list of variables, struct or objects. In sert/remove any where.Two examples are give n:1.The first STL example is for data type int2.The sec ond for a list of class in sta nces.They are used to show a simple example and a more complex real world applicati on.1. Lets start with a simple example of a program using STL for a linked list:// Simple example uses type int#in clude <iostream> #in clude <list>//In sert a new eleme nt at the end//Insert a new eleme nt at the beg inning// Insert "2" before position of first argument// (Place before sec ond argume nt)L.push_back(5);L.push_back(6);list <in t>::iterator i;for(i=L.begin(); i != L.end(); ++i) cout << *i << "";cout << en dl;return 0;}Compile: g++ example1.cppRun: ./a.outOutput: 0 2 0 5 62. The STL tutorials and texts seem to give simple examples which do notapply to the real world. The following example is for a doubly linked list.Since we are using a class and we are not using defined built-in C++types we have in cluded the followi ng:* To make this example more complete, a copy con structor has bee nin cluded although the compiler will gen erate a member-wise one automatically if needed. This has the samefunctionality as the assignment operator (=).« The assig nment (=) operator must be specified so that sort routi nes can assig n a new order to the members of the using n amespace std;int mai n()list<i nt> L;L.push_back(O); L.push_fro nt(0); L.i nsert(++L.beg in( ),2);list.« The "less than" (<) operator must be specified so that sort routines candetermine if one class instance is "less than" another.« The "equals to" (==) operator must be specified so that sort routines candetermine if one class instance is "equals to" another.// Stan dard Template Library example using a class.#in clude <iostream>#in clude <list>using n amespace std;// The List STL template requires overloading operators =, == and <.〃vc2005调试没有错(红色字体部分可去掉)、可用vc6.0却报错了“ 'operator <<' is ambiguous ” (vc6.0的加上红色字体部分)class AAA;ostream &operator«(ostream &output, const AAA &aaa);class AAA{frie nd ostream &operator<<(ostream &, const AAA &);public:int x;int y;float 乙AAA();AAA(co nst AAA &);~AAA(){};AAA & operator=(co nst AAA &rhs);int operator==(c onst AAA &rhs) con st;int operator<(c onst AAA &rhs) con st;};AAA::AAA() // Con structor{x = 0;y = 0;z = 0;}AAA::AAA(c onst AAA &copy in) // Copy con structor to han die pass by value. {x = copy in.x;y = copyi n.y;z = copy in.z;}ostream &operator<<(ostream &output, const AAA &aaa){output << aaa.x << ' ' << aaa.y << ' ' << aaa.z << en di;return output;}AAA& AAA::operator=(co nst AAA &rhs)this->x = rhs.x;this->y = rhs.y;this->z = rhs. z;return *this;}int AAA::operator==(c onst AAA &rhs) const{if( this->x != rhs.x) return 0;if( this->y != rhs.y) return 0;if( this->z != rhs.z) return 0;return 1;}// This function is required for built-in STL list functions like sortint AAA::operator<(c onst AAA &rhs) const{if( this->x == rhs.x && this->y == rhs.y && this->z < rhs.z) return 1;if( this->x == rhs.x && this->y < rhs.y) retur n 1;if( this->x < rhs.x ) return 1;return 0;}int mai n(){list<AAA> L;AAA Ablob ;Ablob.x=7;Ablob.y=2;Ablob.z=4.2355;L.push_back(Ablob); //In sert a new eleme nt at the endAblob.x=5;L.push_back(Ablob); // Object passed by value. Uses default member-wise // copy con structor Ablob.z=3.2355;L.push_back(Ablob);Ablob.x=3;Ablob.y=7;Ablob.z=7.2355;L.push_back(Ablob);list<AAA>::iterator i;for(i=L.beg in(); i 匸L.e nd(); ++i) cout << (*i).x << " "; // print membercout << en dl;for(i=L.beg in(); i 匸L.e nd(); ++i) cout << *i << " "; // print with overloadedoperatorcout << en dl;cout << "Sorted: " << en dl;L.sort();for(i二L.beg in(); i 匸L.e nd(); ++i) cout << *i << " "; // print with overloaded operator cout << en dl;return 0;}Output:7 5 5 37 2 4.23555 2 4.23555 2 3.23553 7 7.2355Sorted:3 7 7.23555 2 3.2355 5 2 4.2355 7 2 4.2355。

相关文档
最新文档