今天看单项链表和双向链表的时候,一下子想到了斐波那契数列,如何用链表管理斐波那契数列呢?首先我们来看看单链表!
1、单链表结构
class SingleLinked
{
public:
SingleLinked(int value)
{
m_value = value;
next = NULL;
}
int m_value;
SingleLinked* next;
};
2、单链表如何遍历数据的呢,比如我们要打印链表的数据,我们打印是不是又可以正序打印或者倒叙打印
//倒叙
void desc(SingleLinked* p)
{
if (NULL == p)
{
return;
}
desc(p->next);
printf("%d,",p->m_value);
}
// 正序
void asc(SingleLinked* p)
{
if (NULL == p)
{
return;
}
printf("%d,",p->m_value);
asc(p->next);
}
int main(int argc, char *argv[])
{
SingleLinked* l1 = new SingleLinked(1);
SingleLinked* l2 = new SingleLinked(2);
SingleLinked* l3 = new SingleLinked(3);
SingleLinked* l4 = new SingleLinked(4);
SingleLinked* l5 = new SingleLinked(5);
l1->next = l2;
l2->next = l3;
l3->next = l4;
l4->next = l5;
asc(l1);
printf("\n");
desc(l1);
printf("\n");
return 0;
}
/* 我们来看下结果
1,2,3,4,5,
5,4,3,2,1,
*/
3、那我们斐波那契数列数列,是写成单向能满足吗,如果知道首、只打印OK,但是想用函数创建数列,就不满足了,需要知道前驱的数值,与当前节点计算出下一个节点。双向链表完全满足
双向链表数据结构:
class DoubleleLinked{
public:
DoubleleLinked(int value)
{
m_value = value;
next = NULL;
pre = NULL;
}
int m_value;
DoubleleLinked* next;
DoubleleLinked* pre;
};
递归创建数列:
void Apophile(DoubleleLinked* p)
{
if ((p != NULL) && (p->pre != NULL))
{
int value1 = p->pre->m_value;
int value2 = p->m_value;
int newValue = value1 + value2;
if (newValue < 100) // 创建100以内的数列
{
DoubleleLinked* newNote = new DoubleleLinked(value1 + value2);
p->next = newNote;
newNote->pre = p;
Apophile(newNote);
}
}
}
DoubleleLinked* l1 = new DoubleleLinked(1);
DoubleleLinked* l2 = new DoubleleLinked(1);
l1->next = l2;
l2->pre = l1;
Apophile(l2);
给出任意一个节点,输出数列:
// 向后 按照单链表的顺序打印
void asc(DoubleleLinked*p)
{
if (p != NULL)
{
printf("%d,",p->m_value);
asc(p->next);
}
}
// 向前 按照单链表的倒叙打印
void desc(DoubleleLinked*p)
{
if (p != NULL)
{
desc(p->pre);
printf("%d,",p->m_value);
}
}
// 先倒叙打印前部分,打印自己,顺序打印后部分
void print_line(DoubleleLinked*p)
{
if (p != NULL)
{
desc(p->pre);
printf("%d,",p->m_value);
asc(p->next);
}
}
print_line(l2->next);
// 输出结果 1,1,2,3,5,8,13,21,34,55,89,