第四十四课 递归的思想与应用(中)

将大问题分解,先将第一个节点拿出来,将其它的节点看成一个整体。

 1 #include <iostream>
 2 #include <cstring>
 3 #include "DTString.h"
 4
 5 using namespace std;
 6 using namespace DTLib;
 7
 8 struct Node
 9 {
10     int value;
11     Node* next;
12 };
13
14 Node* create_list(int v, int len)  // v:数据元素从哪一个之开始。 len:长度
15 {
16     Node* ret = NULL;
17     Node* slider = NULL;
18
19     for(int i=0; i<len; i++)
20     {
21         Node* n = new Node();
22
23         n->value = v++;
24         n->next = NULL;
25
26         if( slider == NULL )
27         {
28             slider = n;
29             ret = n;
30         }
31         else
32         {
33             slider->next = n;
34             slider = n;
35         }
36     }
37
38     return ret;
39 }
40
41 void destroy_list(Node* list)
42 {
43     while( list )
44     {
45         Node* del = list;
46
47         list = list->next;
48
49         delete del;
50     }
51 }
52
53 void print_list(Node* list)
54 {
55     while( list )
56     {
57         cout << list->value << "->";
58
59         list = list->next;
60     }
61
62     cout << "NULL" << endl;
63 }
64
65 Node* reverse(Node* list)
66 {
67     if( (list == NULL) || (list->next == NULL) )
68     {
69         return list;
70     }
71     else
72     {
73         Node* guard = list->next;
74         Node* ret = reverse(list->next);
75
76         guard->next = list;
77
78         list->next = NULL;
79
80         return ret;
81     }
82 }
83
84 int main()
85 {
86     Node* list = create_list(1, 5);
87
88     print_list(list);
89
90     list = reverse(list);
91
92     print_list(list);
93
94     destroy_list(list);
95
96     return 0;
97 }

实验2:

  1 #include <iostream>
  2 #include <cstring>
  3 #include "DTString.h"
  4
  5 using namespace std;
  6 using namespace DTLib;
  7
  8 struct Node
  9 {
 10     int value;
 11     Node* next;
 12 };
 13
 14 Node* create_list(int v, int len)  // v:数据元素从哪一个之开始。 len:长度
 15 {
 16     Node* ret = NULL;
 17     Node* slider = NULL;
 18
 19     for(int i=0; i<len; i++)
 20     {
 21         Node* n = new Node();
 22
 23         n->value = v++;
 24         n->next = NULL;
 25
 26         if( slider == NULL )
 27         {
 28             slider = n;
 29             ret = n;
 30         }
 31         else
 32         {
 33             slider->next = n;
 34             slider = n;
 35         }
 36     }
 37
 38     return ret;
 39 }
 40
 41 void destroy_list(Node* list)
 42 {
 43     while( list )
 44     {
 45         Node* del = list;
 46
 47         list = list->next;
 48
 49         delete del;
 50     }
 51 }
 52
 53 void print_list(Node* list)
 54 {
 55     while( list )
 56     {
 57         cout << list->value << "->";
 58
 59         list = list->next;
 60     }
 61
 62     cout << "NULL" << endl;
 63 }
 64
 65 Node* reverse(Node* list)
 66 {
 67     if( (list == NULL) || (list->next == NULL) )
 68     {
 69         return list;
 70     }
 71     else
 72     {
 73         Node* guard = list->next;
 74         Node* ret = reverse(list->next);
 75
 76         guard->next = list;
 77
 78         list->next = NULL;
 79
 80         return ret;
 81     }
 82 }
 83
 84 Node* merge(Node* list1, Node* list2)
 85 {
 86     if( list1 == NULL )
 87     {
 88         return list2;
 89     }
 90     else if( list2 == NULL )
 91     {
 92         return list1;
 93     }
 94     else if( list1->value < list2->value )
 95     {
 96         /*
 97         Node* list1_ = list1->next;
 98         Node* list = merge(list1_, list2);
 99
100         list1->next = list;
101         return list1;
102         */
103         return (list1->next = merge(list1->next, list2), list1); //逗号表达式
104     }
105     else
106     {
107         /*
108         Node* list2_ = list2->next;
109         Node* list = merge(list1, list2_);
110
111         list2->next = list;
112
113         return list2;
114         */
115
116         return (list2->next = merge(list2->next, list1), list2); //逗号表达式
117     }
118 }
119
120 int main()
121 {
122     Node* list1 = create_list(1, 5);
123
124     Node* list2 = create_list(2, 6);
125
126     print_list(list1);
127     print_list(list2);
128
129     Node* list = merge(list1, list2);
130
131     print_list(list);
132
133     destroy_list(list);
134
135     return 0;
136 }

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9678143.html

时间: 2024-10-10 17:06:08

第四十四课 递归的思想与应用(中)的相关文章

第四十五课 递归的思想与应用(下)

g函数返回后,f函数对应的栈中的数据没有任何变化,这就是回溯算法的核心. 可以这样思考,先逆序打印从第二个节点开始的子表,最后再将第一个节点打印出来. 1 #include <iostream> 2 #include <cstring> 3 #include "DTString.h" 4 5 using namespace std; 6 using namespace DTLib; 7 8 struct Node 9 { 10 int value; 11 Nod

centos shell编程6一些工作中实践脚本 第四十节课

centos   shell编程6一些工作中实践脚本    第四十节课 上半节课 下半节课 f

NeHe OpenGL教程 第四十四课:3D光晕

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十四课:3D光晕 3D 光晕 当镜头对准太阳的时候就会出现这种效果,模拟它非常的简单,一点数学和纹理贴图就够了.好好看看吧. 大家好,欢迎来到新的一课,在这一课中我们将扩展glCamera类,来实现镜头光晕的效果.在日常生活中,

NeHe OpenGL教程 第四十二课:多重视口

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十二课:多重视口 多重视口 画中画效果,很酷吧.使用视口它变得很简单,但渲染四次可会大大降低你的显示速度哦:) 欢迎来到充满趣味的另一课.这次我将向你展示怎样在单个窗口内显示多个视口.这些视口在窗口模式下能正确的调整大小.其中有

NeHe OpenGL教程 第四十六课:全屏反走样

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十六课:全屏反走样 全屏反走样 当今显卡的强大功能,你几乎什么都不用做,只需要在创建窗口的时候该一个数据.看看吧,驱动程序为你做完了一切. 在图形的绘制中,直线的走样是非常影响美观的,我们可以使用反走样解决这个问题.在众多的解决

第四十四章

第四十四章1 听罗博士讲述名人的烦恼 名与身孰亲? 名气与身体哪个更重要? 名气固然是有用的,然而不能因此放弃身体. 各位朋友大家好,今天我们接着来聊<道德经>.我们来看看老子老先生带给我们什么样的人生启发了. 今天聊第四十四章,这是新的一章了,这一章实际跟我们的人生真是有很大的关系了,因为我这个音频,除了在我微信公众号刊出之外,还在喜马拉雅播出,喜马拉雅的编辑曾经跟我说:“罗老师您最近能不能讲讲养生的内容啊?”我接下来会给大家讲中医的内容的,但是您说我讲的<道德经>就不是养生吗?

QT开发(四十四)——流方法解析XML

QT开发(四十四)--流方法解析XML 一.流方法解析XML简介 QT 4.3开始,QT引入了两个新的类来读取和写入XML文档:QXmlStreamReader和QXmlStreamWriter. QXmlStreamReader类提供了一个快速的解析器通过一个简单的流API来读取良构的XML文档,是作为QT的SAX解析器的替代者出现的,比SAX解析器更快更方便.    QXmlStreamReader可以从QIODevice或QByteArray中读取数据.QXmlStreamReader以一

【WPF学习】第四十四章 图画

原文:[WPF学习]第四十四章 图画 通过上一章的学习,Geometry抽象类表示形状或路径.Drawing抽象类扮演了互补的角色,它表示2D图画(Drawing)--换句话说,它包含了显示矢量图像或位图需要的所有信息. 尽管有几类画图类,但只有GeometryDrawing类能使用已经学习过的几何图形.它增加了决定如何绘制图形的画笔和填充细节.可将GeometryDrawing对象视为矢量插图中的形状.例如,可将标准的窗口元文件格式(.wmf)转换成准备插入用户界面的GeometryDrawi

ActionScript3游戏中的图像编程(连载四十四,第3章开始)

3.1 Flash简单滤镜真相大揭秘 上一章,我们用Flash的滤镜仅仅模拟了Photoshop里面的两个简单样式(当然只是我们的参数设置得比较简单,Photoshop样式远比我们想象中的复杂),就已经困难重重,一波三折了,而且效果还不如Photoshop的细致.那么,到底是什么原因导致Flash的简单滤镜如此受限?Flash简单滤镜是如何实现的? 进入本节之前,先明确下简单滤镜的概念,在ActionScript中,滤镜可以分为两大类,简单滤镜和复杂滤镜,前者指可以通过Flash IDE直接设置

【Unity 3D】学习笔记四十四:路径渲染

路径渲染 路径渲染属于特效渲染组件,用于跟随运动中的游戏对象.首先在hierarchy视图中,创建一个球体.然后在菜单导航栏中选择component--effects--trial renderer即可将路径渲染组件添加至该球体对象中. cast shadows:显示阴影效果. receive shadows:接受阴影效果. materials:材质. size:渲染的材质数量,可添加或删除. element 0:渲染材质文件. use light probes:是否使用光线探头. light