算法导论第十章数据结构--双向链表

看的概念挺朦胧的,没有明确好双链表到底需要哪些方法,其实针对这种结构应该可以写很多方法,并没有什么特定标准。

不过真是只看不练不行啊,一下手各种错误,各种溢出

#include<iostream>

using namespace std;

template<class T> struct Node

{

T value;

Node<T>* pre;

Node<T>* next;

};

template<class T> class Flist

{

private:

Node<T>* front;

Node<T>* end; //每写一个函数,遍历类中变量哪个要维护

int count;

public:

Flist();   //defaut constructor

~Flist();

Flist(const Flist& C_list);//支持了这个,没有写支持 = 可以写个空的内联函数来放空这种行为,否则有相关操作时,编译器会自动产生

inline void Deeply_Copy(const Flist& Copylist);

bool Isempty() const;

int Listsize() const;

T& Listfront()const;

T& Listend() const;  //返回引用是不是可以改首尾node的key值了

void push_front(T N);

void push_back(T N);

void del_front();

void del_back();

//Node<T>* Listfind(T x); //搜索有key值x的节点

T ShowKey(int n);   //输出第n个值

};

template<class T> Flist<T>::Flist():count(0),front(0),end(0) //初始化顺序与类中声明有关与这无关

{

}

template<class T> Flist<T>::~Flist()

{

Node<T>* temp;

while (front != 0)

{

temp = front;

delete temp;

front = front->next;

}

temp = NULL;

}

template<class T> bool Flist<T>::Isempty() const

{

return 0 == count;

}

template<class T> int Flist<T>::Listsize() const{

return count;

}

template<class T> Flist<T>::Flist(const Flist& C_list)

{

Deeply_Copy(C_list);

}

template<class T> T& Flist<T>::Listfront() const

{

return front->value;

}

template<class T> T& Flist<T>::Listend() const

{

return end->value;

}

template<class T> void Flist<T>::push_front(T N)

{

Node<T>* p = new Node<T>;

p->value = N;

p->next = front;

if (front != 0)

front->pre = p;

front = p;

if(end == 0)

end = p ;

p->pre = 0;

count++;

}

template<class T> void Flist<T>::push_back(T N)

{

Node<T>* p = new Node<T>;

p->value = N;

p->pre = end;

if (end != 0)   //一开始这里崩溃是因为end没有初始化0就用

end->next = p;

end = p;

end->next = 0;

count++;

}

template<class T> void Flist<T>::del_front()

{

Node<T>* temp = front;

front = front->next;

count--;

front->pre = 0;

delete temp;

}

template<class T> void Flist<T>::del_back()

{

Node<T>* temp = end;

end = end->pre;

end->next = 0;

count--;

delete temp;

}

template<class T> T Flist<T>::ShowKey(int n)

{

/*

if (front == 0)

{

cout << "there is no element is the list.." << endl;

return ;                                          //未解决,size为0时,如何提示

}*/

if ((front !=0)  && (n <=count) && (n >= 1))

{

Node<T>* temp = front;

while(--n)                    //这里如果while(n--)就溢出崩溃,n用后再减,这里的用是判断,不要以为只是括号就可以前后随便用

{

temp = temp->next;   //n大于size也会溢出

}

return temp->value;

//这里temp指向了一个也有其他指针指向节点,可不要delete

}

}

template<class T> void Flist<T>::Deeply_Copy(const Flist& Copylist)

{

front = end = 0;

if (Copylist.front == 0)

return ;          //这里起到了结束函数的作用

front = new Node<T>;

Node<T>* cp = Copylist.front;

Node<T>* np = front;

np->value = cp->value;

count = 1;

np->pre = 0;

cp = cp->next;

while (cp != 0)

{

np->next = new Node<T>;

count++;

(np->next)->pre = np;

np = np->next;

np->value = cp->value;

cp = cp->next;

}

end = np;

}

int main()

{

Flist<int> listf;

int a[5] = {1,2,3,4,5};

for (int i = 0 ; i < 5 ; i++)

listf.push_front(a[i]);

cout << "lisrfsize: " << listf.Listsize() << endl;

for (int i = 0 ; i < 5 ; i++)

listf.push_back(a[i]);

cout << "lisrfsize: " << listf.Listsize() << endl;

cout << "listf is empty? : " << listf.Isempty() << endl;

Flist<int> listf2(listf);

cout << "Listf2size : " << listf2.Listsize() << endl;

listf2.del_front();

listf2.del_back();

cout << "Listf2 front :" << listf2.Listfront() << endl;

cout << "Listf2 end :" << listf2.Listend() << endl;

cout << "Listf2 size :" << listf2.Listsize() << endl;

for (int i = 1; i <= listf2.Listsize(); i++)

cout << listf2.ShowKey(i) << endl;

return 0;

}

时间: 2024-08-15 20:51:13

算法导论第十章数据结构--双向链表的相关文章

算法导论8:数据结构——栈 2016.1.8

栈在暑假的时候接触过了,当时还写了个计算器,用的中缀表达式后缀表达式的栈操作. http://www.cnblogs.com/itlqs/p/4749998.html 今天按照算法导论上的讲解规范了一下代码.主要是栈的初始化.判断空栈.入栈.出栈.遍历栈. #include<stdio.h> #define MAXTOP 10 struct _stack { int top; int num[MAXTOP+1]; }s; void init(struct _stack &S) { S.

算法导论 第十章 基本数据类型 &amp; 第十一章 散列表(python)

更多的理论细节可以用<数据结构>严蔚敏 看几遍,数据结构很重要是实现算法的很大一部分 下面主要谈谈python什么实现 10.1 栈和队列 栈:后进先出LIFO 队列:先进先出FIFO python 中使用list实现在这些功能 栈:压栈 append() 退栈   pop() 队列:   入队 append() 出队 pop(0) 栈: >>> stack = list() >>> stack.append(3) >>> stack.ap

算法导论第十章 栈队列和链表

本章讲述的是基本的数据结构,如栈.队列和链表.这些都是最最基本的数据结构,具体的就不再啰嗦.然后本章也没有什么需要特别注意的点,哦,有一个小节:指针和对象的实现,可以认真看一下,大概就是用其他的实现方式来代替指针和对象的实现,因为有些语言不支持指针和对象数据类型,那在实现这种链式的数据结构就无法表示,本节介绍的方法就是利用数组和数组下标来构造对象和指针,说白了,就是利用数组来表示链式对象.个人感觉意义不大,权当了解得了. 结合一些常见的笔试面试题,我就用3个习题来总结这一章吧. 1.习题10.1

基本数据结构(算法导论)与python

原文链接 Stack, Queue Stack是后进先出, LIFO, 队列为先进先出, FIFO在Python中两者, 都可以简单的用list实现,进, 用append()出, Stack用pop(), Queue用pop(0), pop的时候注意判断len(l) 对于优先队列, 要用到前面讲到的堆 链表和多重数组 这些数据结构在python中就没有存在的价值, 用list都能轻松实现 散列表 为了满足实时查询的需求而产生的数据结构, 查询复杂度的期望是O(1), 最差为O(n)问题描述, 对

算法导论读书笔记-第十四章-数据结构的扩张

算法导论第14章 数据结构的扩张 一些工程应用需要的只是标准数据结构, 但也有许多其他的应用需要对现有数据结构进行少许的创新和改造, 但是只在很少情况下需要创造出全新类型的数据结构, 更经常的是通过存储额外信息的方法来扩张一种标准的数据结构, 然后对这种数据结构编写新的操作来支持所需要的应用. 但是对数据结构的扩张并不总是简单直接的, 因为新的信息必须要能被该数据结构上的常规操作更新和维护. 14.1 动态顺序统计 顺序统计树(order-static tree) : 在红黑树的基础上, 在每个

算法导论部分总结图片版

我们的算法导论:(中文版下载链接) 目录(Table of Contents)前言(Preface)第一部分(Part I) 基础(Foundations)第一章 计算中算法的角色(The Role of Algorithms in Computing)第二章 开始(Getting Started)第三章 函数的增长率(Growth of Functions)第四章 递归(Recurrences)第五章 概率分析与随机化算法(Probabilistic Analysis and Randomiz

算法导论 学习资源

学习的过程会遇到些问题,发现了一些比较好的资源,每章都会看下别人写的总结,自己太懒了,先记录下别人写的吧,呵呵. 1  Tanky Woo的,每次差不多都看他的 <算法导论>学习总结 - 1.前言 <算法导论>学习总结 - 2.第一章 && 第二章 && 第三章 <算法导论>学习总结 - 3.第四章 && 第五章 <算法导论>学习总结 - 4.第六章(1) 堆排序 <算法导论>学习总结 - 5.第六

算法导论——lec 12 平摊分析与优先队列

在平摊分析中,执行一系列数据结构操作所需要的时间是通过对执行的所有操作求平均得出,反映在任何情况下(即最坏情况下),每个操作具有平均性能.掌握了平摊分析主要有三种方法,聚集分析.记账方法.势能方法.掌握了平摊分析的方法以后,我们就可以利用他来分析一些优先队列. 一. 平摊分析 [问题一]对作用于一个初始为空的栈上的n个PUSH.POP和MULTIPOP组成的序列进行分析. [问题二]考虑一个由0开始向上计数的k位二进制计数器.作用于一个初始为零的计数器上的n个INCREMENT操作的时间分析.

《算法导论》— Chapter 11 散列表

1 序 在很多应用中,都要用到一种动态集合结构,它仅支持INSERT.SEARCH以及DELETE三种字典操作.例如计算机程序设计语言的编译程序需要维护一个符号表,其中元素的关键字为任意字符串,与语言中的标识符相对应.实现字典的一种有效数据结构为散列表. 散列表是普通数组的推广,因为可以对数组进行直接寻址,故可以在O(1)的时间内访问数组的任意元素.对于散列表,最坏情况下查找一个元素的时间与在链表中查找的时间相同,为O(n),但是在实践中,散列表的效率通常是很高的,在一些合理的假设下,散列表中查