List(1)List单链表的链式实现
来源:互联网 发布:哭声剧情解析知乎 编辑:程序博客网 时间:2024/05/16 11:17
若有错误,诚请指正
list.h
/*----------------------------------------------- Created By EverSteins Email:EverSteins@gmail.com 转载请注明出处 ------------------------------------------------*/ #ifndef LIST_H#define LIST_H#include "utility.h"typedef int ElemType;class LinkList{public:LinkList():count_(0),head_node_(NULL){}~LinkList();bool Empty() const{return count_ == 0;}int Size() const{return count_;}bool Insert(const int position,const ElemType &item);bool Remove(const int position,ElemType &item);bool Remove(const int position);bool Retrieve(const int position,ElemType &item) const;bool Replace(const int position,const ElemType &item);void ShowAllEntry() const;private:struct LinkListNode{LinkListNode(ElemType entry,LinkListNode *next):entry_(entry),next_(next){}ElemType entry_;LinkListNode *next_;};LinkListNode * SetPosition(const int position) const;int count_;LinkListNode *head_node_;#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&)DISALLOW_COPY_AND_ASSIGN(LinkList);#undef DISALLOW_COPY_AND_ASSIGN};#endif
list.cc
/*----------------------------------------------- Created By EverSteins Email:EverSteins@gmail.com 转载请注明出处 ------------------------------------------------*/ #include "stdafx.h"#include <iostream>#include "utility.h"#include "list.h"using namespace std;//时间复杂度O(n)LinkList::LinkListNode * LinkList::SetPosition(const int position) const{//pre:0<=position<count(LinkList::Insert时可以position等于count)assert(position>=0);LinkListNode *tmp_node=head_node_;for (int i=0;i<position;++i)tmp_node=tmp_node->next_;return tmp_node;}//时间复杂度O(n)bool LinkList::Insert(const int position,const ElemType &item){//pre:0<=position<=nassert(position>=0);if (position<0 || position>count_)return false;if (position>0){LinkListNode *previous_node=SetPosition(position-1);LinkListNode *following_node=previous_node->next_;LinkListNode *new_node=new LinkListNode(item,following_node);previous_node->next_=new_node;}else //position == 0时{LinkListNode *new_node=new LinkListNode(item,head_node_);head_node_=new_node;}++count_;assert(count_>=0); //防止溢出return true;}//时间复杂度O(n)bool LinkList::Remove(const int position){//pre:0<=position<=n-1assert(position>=0);if (position<0 || position>=count_)return false;if (position>0) //当不是删除在第一个位置的节点,说明至少有2个节点{LinkListNode *previous_node=SetPosition(position-1);LinkListNode *remove_node=previous_node->next_;LinkListNode *following_node=remove_node->next_;previous_node->next_=following_node;delete remove_node;}else //当删除第一个位置的节点{LinkListNode *following_node=head_node_->next_;delete head_node_;head_node_=following_node;}--count_;return true;}//时间复杂度O(n)bool LinkList::Remove(const int position,ElemType &item){assert(position>=0);if (position<0 || position>=count_)return false;if (position>0) //当不是删除在第一个位置的节点,说明至少有2个节点{LinkListNode *previous_node=SetPosition(position-1);LinkListNode *remove_node=previous_node->next_;LinkListNode *following_node=remove_node->next_;previous_node->next_=following_node;item=remove_node->entry_;delete remove_node;}else //当删除第一个位置的节点{LinkListNode *following_node=head_node_->next_;item=head_node_->entry_;delete head_node_;head_node_=following_node;}--count_;assert(count_>=0);return true;}//时间复杂度O(n)bool LinkList::Retrieve(const int position,ElemType &item) const{assert(position>=0);if (position<0 || position>=count_)return false;LinkListNode *current_node = SetPosition(position-1);item = current_node->entry_;return true;}//时间复杂度O(n)bool LinkList::Replace(const int position,const ElemType &item){assert(position>=0);if (position<0 || position>=count_)return false;LinkListNode *current_node = SetPosition(position-1);current_node->entry_ = item;return true;}void LinkList::ShowAllEntry() const{LinkListNode *tmp_node=head_node_;while (tmp_node != NULL){cout<<tmp_node->entry_<<' ';tmp_node=tmp_node->next_;}cout<<endl;}LinkList::~LinkList(){while (!Remove(0));}
utility.h
/*----------------------------------------------- Created By EverSteins Email:EverSteins@gmail.com转载请注明出处------------------------------------------------*/ #ifndef UTILITY_H#define UTILITY_H#include <cstddef>#include <cstdlib>#include <cassert>#include <stdlib.h>#endif
main.cc
/*----------------------------------------------- Created By EverSteins Email:EverSteins@gmail.com 转载请注明出处 ------------------------------------------------*/ #include "stdafx.h"#include "list.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){LinkList list1;list1.Insert(0,1);list1.Insert(1,3);list1.Insert(1,2);list1.ShowAllEntry();list1.Remove(1);list1.Remove(1);list1.Remove(1);list1.Remove(1);list1.ShowAllEntry();cin.get();return 0;}
- List(1)List单链表的链式实现
- List(3)List的单链式实现的增强版(保留当前位置)
- 基于List实现适配器Queue(链式队列)
- 基于List实现适配器queue(链式队列)
- List(2)List的顺序实现
- 线性表(List)---栈的链式存储
- 线性表(List)---队列的链式存储
- 单链表(List)的模板实现
- ArrayList,List等非链式线性结构是如何实现动态增长的
- List C++链式线性表
- list的实现
- list 方法的实现
- list 方法的实现
- list 方法的实现
- list 方法的实现
- list容器的实现
- python list的实现
- list 的c实现
- 个人知识管理
- AsLocal – 直接在“我的电脑”里像U盘一样管理网盘文件!(支持115/QQ中转站/SkyDrive等)(不好意思,重复了)
- jQery的用法
- 求解c 语言里二维数组地址用表示方法
- 提高编程效率
- List(1)List单链表的链式实现
- J2EE总结
- drp阶段总结
- 2011知识回顾
- 一月一首乐之灵动-我的2011,撒哟拉拉之小田和正《再见》
- U盘制作系统盘
- VB中Image控件如何加载网络图片
- LMS算法
- 指针函数与函数指针的区别