sql表中只有子节点的递归_链表递归题型大解密,这类题还学不会算我输!

edaf328cc6f9e3ab813029e14b24e9ba.png 430a5debf5b90ce780375b30fffd7635.gif 

递归的定义

在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。

430a5debf5b90ce780375b30fffd7635.gif 

递归算法的设计

递归的求解过程均有这样的特征:先将整个问题划分为若干个子问题,通过分别求解子问题,最后获得整个问题的解。而这些子问题具有与原问题相同的求解方法,于是可以再将它们划分成若干个子问题,分别求解,如此反复进行,直到不能再划分成子问题,或已经可以求解为止。这种自上而下将问题分解、求解,再自上而下引用、合并,求出最后解答的过程称为递归求解过程,这是一种分而治之的算法设计方法

简单递归算法设计方法: 4c327d0d1ff5c5511956dd35d2c0528b.png

例题

  有一个不带表头节点的单链表,其节点类型如下: typedef struct NodeType {    ElemType data;
   struct NodeType *next;
 }NodeType; 设计如下递归算法:  1   求以h为首指针的单链表的节点个数。  2   正向显示以h为首指针的单链表的所有节点值。  3   反向显示以h为首指针的单链表的所有节点值。  4   删除以h为首指针的单链表中值为x的第一个节点。  5   删除以h为首指针的单链表中值为x的所有节点。  6   输出以h为首指针的单链表中最大节点值。  7   输出以h为首指针的单链表中最小节点值。  8   删除并释放以h为首指针的单链表中所有节点。 解:设h为不带头节点的单链表(含n个节点),如图所示,h->next 也是一个不带头节点的单链表(含n-1个节点),两者除了相差一个节点外,其他都是相似的。 8f1a01f7449352ca3f0297fa9cd58bc5.png

01

 1   求以h为首指针的单链表的节点个数。 设count(h)用于计算单链表h的结点个数,其递归模型如下: ce2943f49201b9a05cb29762bf87ea46.png 对于的递归算法如下:
int count(NodeType *h){  if(h==NULL)    return 0;  else    return (1+count(h->next));}

02

  2   正向显示以h为首指针的单链表的所有节点值。 设traverse(h)用于正向扫描单链表h,其递归模型如下: f4279df0f5b6a05fa90ed1da278f0bed.png 对于的递归算法如下:
void traverse(NodeType *h){  if(h!=null) {   printf("%d",h->data);   traverse(h->next);  }}

03

 3   反向显示以h为首指针的单链表的所有节点值。 设revtraverse(h)用于反向扫描链表h,其递归模型如下: 055532136fe60856b1d7f3ffa19eeb0a.png 对于的递归算法如下:
void revtraverse(NodeType *h){  if(h!=null) {   revtraverse(h->next);   printf("%d",h->data);  }}

04

 4   删除以h为首指针的单链表中值为x的第一个节点。 设delnode(h,x)用于删除单链表h中第一个值为x的结点,其递归模型如下: bdfd9ff2014532230524419cf9ba5ff6.png 对于的递归算法如下:
void delnode(NodeType *&h,ElemType x){  NodeType *p;  if(h!=NULL) {   if(h->data == x)  {    p = h;    h = h->next;    free(p);   }   else    delnode(h->next,x);  }}

05

 5   删除以h为首指针的单链表中值为x的所有节点。 设delall(h,x)用于删除单链表h中所有值为x的结点,其递归模型如下: d64f356be9191a1c056a59aa5bb83f0b.png 对于的递归算法如下:
void delall(NodeType *&h, ElemType x){  NodeType *p;  if(h!=NULL) {   if(h->data == x)  //若首结点的值为x  {    p = h;    h = h->next;    free(p);    delall(h,x);   //在后继结点递归删除   }   else              //若首结点值不为 x     delall(h->next,x);  //在后继结点递归删除   }}

06

 6   输出以h为首指针的单链表中最大节点值。 设maxv(h)用于计算单链表h的最大结点值,其递归模型如下(其中MAXV(x,y) 表示返回x和y的较大者): c94a6c0ec3230a024227dc5f487968c3.png 对于的递归算法如下:
ElemType maxv(NodeType *h){  ElemType m;  if(h->next == NULL)    //只有一个结点的情况    return (h->data);  m = maxv(h->next);     //求后继结点的最大值    if(m>h->data)    return m;  else    return h->data;}

07

 7   输出以h为首指针的单链表中最小节点值。 设minv(h)用于计算单链表h的最小结点值,其递归模型如下(其中MIN(x,y)表示返回x和y的较小者): c94a6c0ec3230a024227dc5f487968c3.png 对于的递归算法如下:
ElemType minv(NodeType *h){  ElemType m;  if(h->next == NULL)    return h->data;  m = minv(h->next);  if(m>h->data)    return h->data;  else    return m;}

08

 8   删除并释放以h为首指针的单链表中所有节点。 设release(h)的功能是删除并释放单链表h中所有结点,其递归模型如下: c94a6c0ec3230a024227dc5f487968c3.png 对于的递归算法如下:
void release(NodeType *h){  if(h!=NULL) {  release(h->next);  free(h);  }}
963c02237a9e4a75e63556cab604c336.gif

真题回顾

已知f为单链表的表头指针,链表中存储的都是整型数据,请写出实现下列运算的递归算法,求: (1)链表中最大整数; (2)所有整数的平均值。(10分)   e06ae1e8c017dd2ba5f35064bb11e2d3.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值