带有头结点的简单链表实现
来源:互联网 发布:手机app编程软件 编辑:程序博客网 时间:2024/05/16 11:33
#ifndef LinkedList_H #define LinkedList_H #include "dsexceptions.h" #include <iostream> // For NULL // List class // // CONSTRUCTION: with no initializer // Access is via ListItr class // // ******************PUBLIC OPERATIONS********************* // boolean isEmpty( ) --> Return true if empty; else false // void makeEmpty( ) --> Remove all items // ListItr zeroth( ) --> Return position to prior to first // ListItr first( ) --> Return first position // void insert( x, p ) --> Insert x after current iterator position p // void remove( x ) --> Remove x // ListItr find( x ) --> Return position that views x // ListItr findPrevious( x ) // --> Return position prior to x // ******************ERRORS******************************** // No special errors template <class Object> class List; // Incomplete declaration. template <class Object> class ListItr; // Incomplete declaration. template <class Object> class ListNode { ListNode( const Object & theElement = Object( ), ListNode * n = NULL ) : element( theElement ), next( n ) { } Object element; ListNode *next; friend class List<Object>; friend class ListItr<Object>; }; template <class Object> class List { public: List( ); List( const List & rhs ); ~List( ); bool isEmpty( ) const; void makeEmpty( ); ListItr<Object> zeroth( ) const; ListItr<Object> first( ) const; void insert( const Object & x, const ListItr<Object> & p ); ListItr<Object> find( const Object & x ) const; ListItr<Object> findPrevious( const Object & x ) const; void remove( const Object & x ); const List & operator=( const List & rhs ); private: ListNode<Object> *header; }; // ListItr class; maintains "current position" // // CONSTRUCTION: Package friendly only, with a ListNode // // ******************PUBLIC OPERATIONS********************* // bool isPastEnd( ) --> True if past end position in list // void advance( ) --> Advance (if not already null) // Object retrieve --> Return item in current position template <class Object> class ListItr { public: ListItr( ) : current( NULL ) {} bool isPastEnd( ) const { return current == NULL; } void advance( ) { if( !isPastEnd( ) ) current = current->next;} const Object & retrieve( ) const { if( isPastEnd( ) ) throw BadIterator( ); return current->element; } private: ListNode<Object> *current; // Current position ListItr( ListNode<Object> *theNode ) : current( theNode ) { } friend class List<Object>; // Grant access to constructor }; #include "LinkedList.cpp" #endif
实现文件:
#include "LinkedList.h" /** * Construct the list */ template <class Object> List<Object>::List( ) { header = new ListNode<Object>; } /** * Copy constructor */ template <class Object> List<Object>::List( const List<Object> & rhs ) { header = new ListNode<Object>; *this = rhs; } /** * Destructor */ template <class Object> List<Object>::~List( ) { makeEmpty( ); delete header; } /** * Test if the list is logically empty. * return true if empty, false otherwise. */ template <class Object> bool List<Object>::isEmpty( ) const { return header->next == NULL; } /** * Make the list logically empty. */ template <class Object> void List<Object>::makeEmpty( ) { while( !isEmpty( ) ) remove( first( ).retrieve( ) ); } /** * Return an iterator representing the header node. */ template <class Object> ListItr<Object> List<Object>::zeroth( ) const { return ListItr<Object>( header ); } /** * Return an iterator representing the first node in the list. * This operation is valid for empty lists. */ template <class Object> ListItr<Object> List<Object>::first( ) const { return ListItr<Object>( header->next ); } /** * Insert item x after p. */ template <class Object> void List<Object>::insert( const Object & x, const ListItr<Object> & p ) { if( p.current != NULL ) p.current->next = new ListNode<Object>( x, p.current->next ); } /** * Return iterator corresponding to the first node containing an item x. * Iterator isPastEnd if item is not found. */ template <class Object> ListItr<Object> List<Object>::find( const Object & x ) const {/* 1*/ ListNode<Object> *itr = header->next;/* 2*/ while( itr != NULL && itr->element != x )/* 3*/ itr = itr->next;/* 4*/ return ListItr<Object>( itr ); } /** * Return iterator prior to the first node containing an item x. */ template <class Object> ListItr<Object> List<Object>::findPrevious( const Object & x ) const {/* 1*/ ListNode<Object> *itr = header;/* 2*/ while( itr->next != NULL && itr->next->element != x )/* 3*/ itr = itr->next;/* 4*/ return ListItr<Object>( itr ); } /** * Remove the first occurrence of an item x. */ template <class Object> void List<Object>::remove( const Object & x ) { ListItr<Object> p = findPrevious( x ); if( p.current->next != NULL ) { ListNode<Object> *oldNode = p.current->next; p.current->next = p.current->next->next; // Bypass deleted node delete oldNode; } } /** * Deep copy of linked lists. */ template <class Object> const List<Object> & List<Object>::operator=( const List<Object> & rhs ) { ListItr<Object> ritr = rhs.first( ); ListItr<Object> itr = zeroth( ); if( this != &rhs ) { makeEmpty( ); for( ; !ritr.isPastEnd( ); ritr.advance( ), itr.advance( ) ) insert( ritr.retrieve( ), itr ); } return *this; }
更多文章,欢迎访问:http://blog.csdn.net/wallwind
- 带有头结点的简单链表实现
- 带有头结点的链表实现
- 实现带有头结点的链表
- C++ 带有头结点的单链表的简单实现
- 带有头结点的双向链表
- 带有头结点的链表与没有头结点的链表的对比
- 带有头结点的双向循环链表
- (学习java)带有头结点的单向循环链表
- 带有头结点的单链表的操作
- 链表的 头指针 头结点
- 数据结构与算法分析——带有头结点的单链表的实现(C语言)
- C语言有头结点链表的经典实现
- C++实现无头结点的双向链表
- 实现有头结点的单链表的简单操作
- 链表知识点(十)【删除带有头结点的单链表的第一个结点(包含数据的第一个节点)】
- 建立一个带有头结点的单向链表,并将存储在数组中的字符依次转储到链表的各个结点中。
- 建立一个带有头结点的单向链表,并将存储在数组中的字符依次转储到链表的各个结点中
- 程序功能:建立一个带有头结点的单向链表,并将存储在数组中的字符依次转储到链表的各个结点中。
- 搜索背后的奥秘——浅谈语义主题计算
- asp.net server application error 解决办法
- anytime you feel the pain,hey,dear,refrain
- 2011贺岁片之——寒假计划
- 闪电记事,好用的电子日记本软件
- 带有头结点的简单链表实现
- 如何才能做好asp的网站安全性,有哪些需要注意的细节和技巧呢?
- 试用3个库进行https通讯
- 开源的软电话汇总
- 控制台 贪吃蛇 游戏
- 新年新起点
- Linux 2.6软RAID速度测试
- 2012 期盼
- 以编程方式嵌入图片到Word图片内容控件