这里使用较为简洁的语言,让你理解 双向循环链表的实现,用大白话 透彻的剖析 这种结构的实现。让大家能够像对待艺术一样,去对待书写代码。爱上编程,爱上Coding!
工具/原料
方法/步骤
1创建工程 - 控制台程序 ; 创建文件-CPP文件-添加到工程中。如下截图。创建控制台程序的目的是 是单纯的写程序,程序这东西,说白了是看不到摸不着的,是逻辑的实体,对于我们的 数据结构类型 (双向循环链表也是)的问题,控制台程序足够了。这里直接添加CPP文件,也是为了方便。没有用.h文件,应为我们是为了写好 “双向循环链表”,对于细节的问题,大家可以去进一步询问度娘。
2万事俱备,只欠东风。到了我们真正写点东西的时候了——代码。首先,我们得把C++中的应该导入的标准输入输出文件头导入弄了半天了,下面才是我们应该写的主体部分。拿一个普通的链表来说,都是由一个个结点构成的,多个结点穿在一起就形成了链表。就像冰糖葫芦一样。山楂就是结点。好下面struct Node 就是一个山楂的结构体。这里定义了data 是int类型,就是代表当前节点的数据(此处只是为了表示的方便而已),还有 pre 和 next 是指向前面和后面的结点的指针。
3结点说完了,下面我们要组装双向循环链表这个“糖葫芦”了,下面定义了DList类是双向循环链表类。定义了两个不同的构造函数。第一个是无参数的构造函数。第二个是使用一个数组,以及数组长度的两个参数的构造函数。第一个构造函数方法体是空的,那就不用说了,第二个构造函数方法体是将每个数据 “从链表的尾部插入”的过程。也很好理解。注意这里是使用了代头结点的,即第一个结点是没有用的,只是占位,操作方便。整个类写的十分简单。就是 顺序打印,逆序打印,添加元素main函数是测试代码,十分简单
4测试运行结构如下,贴上整个代码,仅供参考#include using namespace std ; //双向循环链表结点struct Node{ int data ; Node * pre ; Node * next ; Node():data(0),pre(NULL),next(NULL){} //构造函数1,初始化数据 Node(int d):data(d),pre(NULL),next(NULL){} //构造函数2,初始化数据};//带头结点的双向链循环表类class DList{public : Node * head; //头结点 DList(){ head = new Node(0); head->pre = head ; head->next = head ; } DList(int ds [],int n){ //用数组初始化链表 head = new Node(0); //生成头结点 head->pre = head ; head->next = head ; for(int i = 0 ; i < n ; i ++ ){ Node * p = new Node(ds[i]) ; //新节点 p->pre = head->pre ; //这4步是插入过程。 p->next = head ; head->pre ->next = p ; head->pre = p ; } } ~DList(){ //析构函数 Node * p = head->next ; Node * q = NULL; while(p!= head){ q = p ; p=p->next ; delete q ; } delete head ; } void PrintDList1(){ //正向输出链表 Node * p = head->next ; while(p!= head){ cout<data<<' ' ; p=p->next ; } } void PrintDList2(){ //逆向输出链表 Node * p = head->pre ; while(p!= head){ cout<data<<' ' ; p=p->pre ; } } void Add(int data){ //添加一个结点 Node * p = new Node(data) ; p->next = head ; p->pre = head->pre ; head->pre->next = p ; head->pre = p ; } };int main(){ //测试 int ds[] = {1,2,3,4,5,6,7,8,9,10} ; DList dlist(ds,10) ; dlist.PrintDList1() ; cout<
注意事项
2VC++6.0不稳定,经常罢工,罢工后使用任务管理器勾掉他,然后重启