关于如何创建双向链表的解析
链表由无数模块(struct)穿成一串组成,每个模块都有两个指针(双向链表),一个指向上一个模块,一个指向下一个模块,还有一些其他变量用来存储自己想要存储的内容。
嗯,话说作者前几天还想要写一个无限精确度的计算器呢,就想到用链表实现。
//这里每一位=一个模块
struct BIT
{
BIT* previousBit;//指向上一个结构体
int theBit;//这一位数是什么
BIT* nextBit;//指向下一个结构体
};
这样nextBit 指向一个BIT结构体,BIT结构体之下又有一个nextBit,就好像串糖葫芦一样,把无数位串联起来了,最后形成下面这样的情况:
当然 ,“1”BIT 里面的 previousBit和“4”BIT 里面的 nextBit不能不管他们呀,于是经过改良,就成了这样:
这样还有一个好处,就是当我们遍历链表的时候,一旦碰到NULL值之后,就知道这个链表已经结束了,不能再遍历下去了。这样我们就使用了 NULL 做我们的终止符
好,言归正传,做一个链表,我们首先应该实现这些功能:
- 能够自由增减链表里的“模块”
- 能够遍历链表检索信息
- 能够完美清空我们的链表
当然,实现这些功能,则应该明确,我们必须知道以下数据:
- 链表的第一个“模块”或者最后一个“模块”
PS:要不我们怎么遍历。。。怎么找到我们的链表在哪?
根据以上总结,我们可以创建一个类解决这些问题:
class CBit
{
struct BIT
{
BIT* previousBit;//指向上一个结构体
int theBit;//这一位数是什么
BIT* nextBit;//指向下一个结构体
};
public:
CBit()
{m_first=0;…}
bool Create(…);
bool Insert(…);
private:
BIT* m_first;
BIT* m_last;
};
对~大致模版就是这样~~如果有兴趣大家可以试一试做出无限位数计算器试试。
我就不帮大家实现了啊~我是个懒人,如果大家想看实例代码的话请点击这里去找度娘求助哈。
接下来是重点:“插入”理论
如果我们想讲一个“模块”插入到2和3之间。。。。那么该怎么操作呢?
First,我们new一个BIT,然后让它指向2和3:
但是问题来了:“2”和“3”根本不买这个新出来的“N”的账,我们需要矫正一下
nBit->nextBit->previousBit = nBit;
nBit->previousBit->nextBit = nBit;
恭喜你,到目前为止,你已经掌握了链表精髓。
但是请注意:小心“2”或着“3”是我们设置的终止符NULL!!!这样这行代码就会导致内存崩溃,直接退出程序:
nBit->nextBit->previousBit = nBit;
nBit->previousBit->nextBit = nBit;
我们最好加一句IF防止这憨货出点不正常的问题
if(nBit->nextBit)
nBit->nextBit->previousBit = nBit;
if(nBit->previousBit)
nBit->previousBit->nextBit = nBit;
OK,没什么好讲的了……
呜,现在天也不早了(1:45),睡了,安。