为方便没有学过数据结构而暂时只接触过语言的初学者轻松简单的使用链表做一些小东西,我写了一个LinkList类,并在其中内置了一些对链表进行基本操作的方法,这样,哪怕没有学习过数据结构,只要稍微懂一点点链表的概念就可以非常轻松的使用这个类
底层实现为双向链表(没错,和STL中的list一样)且添加了一个操作指针cptr用于方便访问和修改链表节点中的数据,也是因为这点,支持链表的(伪)随机访问,在某些情况下提升了些许效率(或许吧)
对于内存管理,该类不会让使用者涉及任何有关内存分配及释放,只需要使用即可
动态链接库版本文章后自取,需要源码的可以私信我:)
目录
int add_node(int flag=0, int n=0);
准备工作
在使用之前,需要将.lib以及.h文件导入,以Visual Studio 2022举例:
创建一个项目,找到该项目的文件夹,这里以项目Test为例
打开Test文件夹并将.lib、.dll以及.h文件复制到该文件夹中
在Visual Studio 2022中打开该项目并添加头文件(.h)
添加资源文件(.lib)
然后就可以创建源文件(.cpp)编写代码了
使用之前需包含LinkList.h
如何使用?
在Main函数内部使用LinkList实例化一个对象
LinkList n;
好啦,你已经完成了所有准备工作,接下来将会依次介绍类方法
LinkList类方法介绍(不包含重载)
-
bool emp(void) const;
判断链表是否为空,是返回true,否则返回false
使用方法举例(举例不代表只能这样使用):
n.emp();
std::cout<<n.emp()<<std::endl;
if(n.emp())
……
-
int show(int n) const;
显示整个链表及其连接关系
参数为每输出n个节点就换行,若忽略,则n为0,输出方向将为竖向
返回链表的有效节点数
使用方法举例(举例不代表只能这样使用):
n.show();
n.show(3);
int x=10;
n.show(x);
-
int show_this(void) const;
显示当前操作指针指向的节点
返回该节点位置(0为第一个有效节点)
使用方法举例(举例不代表只能这样使用):
n.show_this();
std::cout<<n.show_this()<<std::endl;
-
int show_mini(void) const;
显示当前链表的简略视图并显示操作指针所指向的节点
返回链表的有效节点数
使用方法举例(举例不代表只能这样使用):
n.show_mini();
std::cout<<n.show_mini()<<std::endl;
-
int tell(void) const;
返回当前操作指针距离头节点的位置(在第几个节点,0为第一个有效节点)
若返回负值,则为空表
使用方法举例(举例不代表只能这样使用):
n.tell();
std::cout<<n.tell()<<std::endl;
-
int L_move(void);
将操作指针向左移动一个节点并返回移动后所在的节点位置
若为负值,则表示移动后越界,这时操作指针不会移动
使用方法举例(举例不代表只能这样使用):
n.L_move();
std::cout<<n.L_move()<<std::endl;
if(n.L_move()<0)
……
-
int R_move(void);
将操作指针向右移动一个节点并返回移动后所在的节点位置
若为负值,则表示移动后越界,这时操作指针不会移动
使用方法举例(举例不代表只能这样使用):
n.R_move();
std::cout<<n.R_move()<<std::endl;
if(n.R_move()<0)
……
-
int move(int flag, int n);
将操作指针向左或右移动n位
flag为0为向左移动,非0则为向右
返回移动后所在的节点位置
若为负值,则表示移动后越界,这时操作指针不会移动
使用方法举例(举例不代表只能这样使用):
n.move(0,5);
n.move(1,4);
n.move(9999,4);
n.move(-999,7);
if(n.move(1,1)<0)
……
-
void set(void);
将修改指针指向初始位置(头节点)
使用方法举例(举例不代表只能这样使用):
n.set();
-
int add_node(int flag=0, int n=0);
创建节点
flag为位置,0为从头创建,1为从最后创建,非0或1则为自定义位置n(若n超过了链表长度,则视为在最后创建)
若忽略参数,则默认在链表头部创建节点
若忽略第二个参数,则默认在链表头部创建节点
创建成功则会使操作指针指向该节点并返回当前节点的位置(0为第一个有效节点),失败则返回-1
使用方法举例(举例不代表只能这样使用):
n.add_node();
n.add_node(0);
n.add_node(1);
n.add_node(2,5);
-
bool del(void);
删除当前操作指针指向的节点,并使操作指针指向上一个节点
删除成功返回true,否则返回false
使用方法举例(举例不代表只能这样使用):
n.del();
if(n.del())
……
-
bool change(T);
修改操作指针指向的节点的值
根据传入参数类型决定修改该节点中的哪个参数
若修改成功则会返回true,否则为false
使用方法举例(举例不代表只能这样使用):
n.change("Hello C++");
n.change(100);
n.change(3.14159);
unsigned long long int ulli=298759832475;
n.change(ulli);
-
int search(T) const;
查找需要查找的值并作为返回值返回
若没有该值则返回-1
返回第一个找到存在该值的节点的位置
使用方法举例(举例不代表只能这样使用):
n.search("Hello C++");
std::cout<<n.search(100)<<std::endl;
n.set();
//这里之所以加一是因为search返回的值是从0开始(第一个有效节点)
//而使用set后修改指针会指向头节点(第一个有效节点前的一个节点)
//所以就导致search的偏移量会少1,这时就需要+1,哪怕要找的节点是第一个,也需要+1
n.move(0,n.search(3.14159)+1);
//下面这种方法同上
n.set();
n.R_move();//或L_move
n.move(0,n.search(3.14159));
-
void clean(void);
删除链表中所有有效节点,并使操作指针指向头节点
使用方法举例(举例不代表只能这样使用):
n.clean();//清理除头节点以外的所有节点
其它操作
赋值
LinkList n1;
LinkList n2;
std::cout<<n1.emp()<<" "<<n2.emp()<<std::endl;//1 1
n1.add_node();
n1.change(10);
n1.change(3.14);
std::cout<<n1.emp()<<" "<<n2.emp()<<std::endl;//0 1
n2=n1;
std::cout<<n1.emp()<<" "<<n2.emp()<<std::endl;//0 0
初始化
LinkList n1;
n1.add_node();
n1.change(38475348759);
n1.change("TEST");
n1.change('A');
LinkList n2=n1;
作者的话
该程序并不完美且测试并不充分,如果各位使用了且在使用过程中发现了任何问题或者觉得哪里需要改进,欢迎随时私信我,谢谢各位w
下载链接/提取码:
https://pan.baidu.com/s/1y8xJA8yJ6STjtttoBnPiHw?pwd=ttwv 提取码: ttwv