模拟STL链表类的实现

STL内部定义了多种容器和迭代器,方便了数据结构类的使用,且不需关注内部源码。为了方便个人使用习惯,我又重写了一个链表类,作为学C++后的第一个项目作业。我将其命名为clist。

代码及注释

cpp       /*clist是一个链表类,而_clist是链表的一个单元,iter是一个迭代器(与STL模板库用法相同)。clist的成员函数:int:getnum()返回clist中的单元数量。_clist*:add()在clist结尾添加一个单元,但data为初始值。_clist*:add(Type x)在clist结尾添加一个单元,且该单元data为x。_clist*:add(_clist* p,Type x)在p后添加一个单元,且该单元data为x,如果p为NULL则在开头添加。_clist*:add(_clist* p)在p后添加一个单元但该单元data为初始值。void:del(clist* p)删除p指向的元素。void:del()删除整个链表的所有元素。_clist*:next(_clist* p)返回p的下个单元。_clist*:prev(_clist* p)返回p的上个单元。void:putdata(_clist* p,Type x)将x赋给p指向的单元的data。void:putsymbol(_clist*p,int x)将x赋给p指向的单元的symbol。T:data(_clist* p)返回p指向的单元的data值。int:symbol(_clist*p)返回p指向单元的symbol值。不建议使用未列出的函数。_clist的变量说明:_clist* next:该单元的下个单元。_clist* prev:该单元的上个单元。T data:该单元的数据值。int symbol:该单元的标记值。iter的使用说明:iter ++:可以使迭代器从现在位置移向下一位置。iter --:可以使迭代器从现在位置移向上一位置。_clist<T>* &:返回迭代器现在指向的地址。void =(_clist<T>* P):使迭代器指向一个单元的地址。bool ==,!=:判断迭代器的指向地址与另一_clist<T>*地址是否相同。T *:返回迭代器现在的data值。void <<T x:将一个值x赋给现在迭代器指向单元的data。*/#include<stddef.h>template <typename T>class _clist{public:T data;_clist* next;_clist* prev;int symbol;_clist(){next=NULL;prev=NULL;symbol=0;}};template <typename T>class iter{_clist<T>* thepointer;public:T data;bool eol,bol;_clist<T>* next;_clist<T>* prev;int symbol;iter(){next=NULL;prev=NULL;symbol=0;thepointer=NULL;eol=0;bol=0;}iter<T> operator ++(int){if (next==NULL) {eol=1;thepointer=NULL;return *this;}prev=(*next).prev;symbol=(*next).symbol;data=(*next).data;thepointer=next;next=(*next).next;return *this;}iter<T> operator --(int){if (prev==NULL) {bol=1;thepointer=NULL;return *this;}next=(*prev).next;symbol=(*prev).symbol;data=(*prev).data;thepointer=prev;prev=(*prev).prev;return *this;}bool operator =(_clist<T> *p){if (p==NULL) return 1;data=(*p).data;next=(*p).next;prev=(*p).prev;symbol=(*p).symbol;thepointer=p;bol=eol=0;return 0;}bool operator ==(_clist<T>* p){if (p==thepointer) return 1;else return 0;}bool operator !=(_clist<T>* p){if (p==thepointer) return 0;else return 1;}T operator *(){return data;}_clist<T>* operator &(){return (thepointer);}void operator <<(T x){(*thepointer).data=x;}};template <typename T>class clist{public:_clist<T> *head,*tail;_clist<T> *lastp;int num;clist(){head=NULL;tail=NULL;num=0;}int getnum(){_clist<T> *pp;pp=head;int n=0;while (pp!=NULL){n++;pp=(*pp).next;}return n;}clist(_clist<T>& h){head=&h;num=getnum();_clist<T> *pp=head;while ((*pp).next!=NULL)pp=(*pp).next;tail=pp;}_clist<T>* add(){_clist<T>* object2=new _clist<T>;_clist<T>* object1=gettail();if (object1!=NULL) {_clist<T>* t;t=(*object1).next;(*object1).next=object2;(*object2).prev=object1;(*object2).next=t;if (t!=NULL) (*t).prev=object1;num=getnum();if ((*object2).next==NULL) tail=object2;}else{_clist<T>* t=head;(*object2).next=t;(*object2).prev=NULL;if (t!=NULL) (*t).prev=object2;head=object2;if (tail==NULL) tail=object2;num=getnum();}return object2;}_clist<T>* add(T data){_clist<T>* object2=new _clist<T>;(*object2).data=data;_clist<T>* object1=tail;if (object1!=NULL) {_clist<T>* t;t=(*object1).next;(*object1).next=object2;(*object2).prev=object1;(*object2).next=t;if (t!=NULL) (*t).prev=object1;num=getnum();if ((*object2).next==NULL) tail=object2;}else{_clist<T>* t=head;(*object2).next=t;(*object2).prev=NULL;if (t!=NULL) (*t).prev=object2;head=object2;if (tail==NULL) tail=object2;num=getnum();}return object2;}_clist<T>* add(iter<T>& object){_clist<T>* object1=&(object);_clist<T>* object2=new _clist<T>;if (object1!=NULL){_clist<T>* t;t=(*object1).next;(*object1).next=object2;(*object2).prev=object1;(*object2).next=t;if (t!=NULL) (*t).prev=object1;num=getnum();if ((*object2).next==NULL) tail=object2;}else{_clist<T>* t=head;(*object2).next=t;(*object2).prev=NULL;if (t!=NULL) (*t).prev=object2;head=object2;if (tail==NULL) tail=object2;num=getnum();}return object2;}_clist<T>* add(iter<T> object,T data){_clist<T> *object1=&object;_clist<T>* object2=new _clist<T>;(*object2).data=data;if (object1!=NULL){_clist<T>* t;t=(*object1).next;(*object1).next=object2;(*object2).prev=object1;(*object2).next=t;if (t!=NULL) (*t).prev=object1;num=getnum();if ((*object2).next==NULL) tail=object2;}else{_clist<T>* t=head;(*object2).next=t;(*object2).prev=NULL;if (t!=NULL) (*t).prev=object2;head=object2;if (tail==NULL) tail=object2;num=getnum();}return object2;}void del(_clist<T> *object){if (object==lastp) lastp=NULL;if (object==head) head=(*object).next;if (object==tail) tail=(*object).prev;_clist<T> *i=(*object).prev,*j=(*object).next;if (i!=NULL) (*i).next=j;if (j!=NULL) (*j).prev=i;delete object;}void del(){_clist<T>* p=init();_clist<T>* i=p;p=next();while (p!=NULL){delete i;i=p;p=next();}head=tail=NULL;delete i;}_clist<T>* next(_clist<T>* pp){if (pp==NULL) return NULL;else {_clist<T>* hehe=(*pp).next;return hehe;}}_clist<T>* prev(_clist<T> *pp){if (pp==NULL) return NULL;else {_clist<T>* hehe=(*pp).prev;return hehe;}}void movep(_clist<T>* p){lastp=p;}_clist<T>* init(){lastp=gethead();return lastp;}void putdata(_clist<T>*p,T data){(*p).data=data;}void putsymbol(_clist<T>*p,int symbol){(*p).symbol=symbol;}T data(_clist<T>*p){return (*p).data;}int symbol(_clist<T>*p){return (*p).symbol;}_clist<T> gethead(){return *head;}_clist<T> gettail(){return *tail;}};

模拟STL链表类的实现相关推荐

  1. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  2. 1.使用C++封装一个链表类LinkList

     使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...

  3. java模拟单链表环形链表解决约瑟夫问题

    java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...

  4. 浅谈:数据结构之双链表结构与代码模拟双链表的实现

    双链表 本文是观看尚硅谷韩老师数据结构与算法根据老师讲解自己做的笔记,部分信息收集网络 与单链表区别 逻辑上没有区别.他们均是完成线性表的内容.主要的区别是结构上的构造有所区别. 对于单链表: 对于一 ...

  5. python模拟实现链表_python实现链表

    数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表,不过这次,我不是用模拟 ...

  6. python单链表类_python 链表类

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 一般我们都构造双向循环链表. 二 python单向链表实现1 单项链表实现app ...

  7. C++ 笔记(24)— STL map 类(map实例化、插入、查找、删除)

    1. STL 映射类简介 map 和 multimap 是键-值对容器,支持根据键进行查找,区别在于,后者能够存储重复的键,而前者只能存储唯一的键. 为了实现快速查找, STL map 和 multi ...

  8. C++ 笔记(22)— STL string 类(字符串赋值、访问、拼接、查找、翻转、大小写转换)

    1. 实例化和赋值 STL string #include <string> #include <iostream>int main () {using namespace s ...

  9. 数据结构课本学习 --单链表类定义

    单链表的类定义: 复合类: class List;class LinkNode{ //结点类定义 friend class List; //List类所有成员可以使用LinkNode的私有成员,反过来 ...

最新文章

  1. The Innovation | Volume 2 Issue3 正式出版
  2. 一篇小的随笔,关于记忆算法和概念
  3. 理解Python中的类对象、实例对象、属性、方法
  4. PPT设计里的小技巧
  5. Linux 命令之 pico -- 文本编辑器
  6. pcb成型板aoi检测_通过自动光学检测(AOI)实现PCB高速检测
  7. CodeForces 877C
  8. java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码
  9. selenium phantomjs
  10. SQL alter操作
  11. Debian 8 安装BtSync
  12. 纯CSS实现数据上报和HTML验证
  13. 坚果X3怎么样好不好值得买吗,和当贝X3哪款好这篇告诉你
  14. java小游戏 飞翔的小鸟,校园新手入门,分分钟带你玩转编程
  15. H5托盘通知(带声音提醒)
  16. Android studio给备忘录添加背景音乐
  17. 学习笔记DL003:神经网络第二、三次浪潮,数据量、模型规模,精度、复杂度,对现实世界冲击
  18. 设计水花飞溅柠檬汽水饮料广告的PS教程
  19. 【Exploit trick】针对 cred 结构的 cross cache 利用(corCTF 2022-cache-of-castaways)
  20. 【Lyra UI】UI 玩法逻辑小结

热门文章

  1. web前端开发--列表
  2. Linux系统环境查看已经登录用户信息及管理
  3. Zabbix 自定义Item经常Not Supported解决
  4. svn update -r m path 代码还原到某个版本(这样之前的log日志也就没了,也就是清空log日志)...
  5. Ejabberd源码解析前奏--管理
  6. IBM copy service--flashcopy 实验
  7. 各种SQL在Pig中实现
  8. 火狐不支持event.keyCode,用jquery中的event.which轻松解决。
  9. 拦截导弹(最长递增子序列)
  10. 突破安全狗防注入及上传的一些思路