一、为什么要写关于单向链表的实现过程
1、加深记忆,以便在以后的工作中能轻松的完成工作
2、便于查阅
3、供大家参考讨论和学习(欢迎指正)
二、单向链表的数据推演
1、单向链表的单个节点(其实链表的单个节点中只有一个next指针,指向链表的下一个节点)
2、C语言中单向链表的节点的数据定义如下:
typedef struct _strCNode
{
struct _strCNode *next;
}CNode;
3、单向链表的推演示意图
这是一个带有头节点的单向链表,如果头结点(header)的next是空,说明链表为空
4、单向链表中我认为最重要的数据类型的定义和api的抽象,下面直接上代码:
typedef struct __strNode
{
struct __strNode *next;
}CNode;
typedef CNode CLinkList;
// 创建链表
CLinkList * CreateLinkList();
// 向链表的指定位置插入数据,返回插入位置;返回-1插入失败
int InsertLinkListNode(const CLinkList *list, CNode *node, int pos);
// 获取链表指定位置的数据,返回空说明当前位置没有数据
const CNode * GetLinkListNode(const CLinkList *list, int pos);
// 删除链表指定位置的数据
int DeleteLinkListNode(const CLinkList *list, int pos, CNode **node);
// 获取链表的数据长度
int GetLinkListLenght(const CLinkList *list);
//清空链表
int ClearLinkList(const CLinkList *list);
// 销毁链表
void DestoryLinkList(CLinkList *list);
以上是对C语言的单向链表的数据定义和接口
5、C++的链表的其实是一个模板类
template <typename T>
struct Node
{
public:
T *t;
Node<T> *next;
};
template <typename T>
class CSignleLinkList
{
public:
CSignleLinkList();
~CSignleLinkList();
int insert(T *t, int index = 0);
int index(const T *t);
bool get(int index, T &t);
bool remove(int index, const T *t);
void clear();
bool empty();
int lenght();
// class iterator
// {
// public:
// inline iterator():t(0){};
// inline iterator(T *t):t(t){};
// inline iterator(const iterator &o):t(o.t){};
// inline iterator &operator++(){++t;return *this};
// inline bool operator!=(const iterator &o) const { return i != t.i; };
// private:
// T *t;
// };
//
// friend class iterator;
//
// iterator begin();
// iterator end();
private:
Node<T> *header;
int len;
};
上面其中我注释掉的一部分,其实是我想实现迭代器(iterator);iterator的实现,比较重要的是要重载++、!=运算符
C/C++是实现的单向链表的源代码