王道线性表2.3.7综合题01

学习23王道数据结构笔记

一、分析

        前面的都是铺垫,定义、初始化、输出函数都是写链表时必须要熟练掌握的,不做赘述了。

        主要的是这个函数,咱分析分析:

//实现算法删除所有值为x的结点(递归)
bool DelectAllNum(LinkList &L , ElemType e){
    LNode *p;
    if(L == NULL)
        return false;
        
    if(L->data == e){
        p = L;
        L = L->next;        //移动的是地址,前驱的next指向的地址更新
        free(p);            //释放地址
        DelectAllNum(L , e);
    }else
        DelectAllNum(L->next , e);
}

做题的时候没在意,敲代码就懵了,为什么?

L = L->next;  这行代码看起来没有对前驱的next做处理,为什么能运用。后来我看到两个博主的解释终于想通了,我结合一下它们的做说明。

(168条消息) 设计递归算法,删除不带头结点的单链表L中所有值为X的结点_1900_的博客-CSDN博客_递归算法删除不带头结点

(168条消息) 设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点(王道课后习题详解)_Gaolw1102的博客-CSDN博客

他们都说到点上了,结合一下就很好懂了。

①递归运用

王道线性表2.3.7综合题01_第1张图片

 

②引用数据类型

        L = L->next; 这一步在我写代码的时候非常的疑惑,好像没有对其前驱进行修改,为什么会让前驱指向了改结点的后继呢,结合上面大佬的图就解惑了我这个疑惑,因为递归入栈的不是下一个L,而是这个L的前驱,所以没有断链。

        并且我们传递的参数L是引用数据类型对参数的修改,就是对原变量的修改

        也就是说在本层对L的修改操作,会自动同步到上一层的L->next那里去,即上一层的L->next也指向了L->next->next。

二、代码块

/***
 * 不带头结点的算法:
 * 设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
 * 
 ***/
#include 
#include 

using namespace std;

#define MaxSize 50
typedef int ElemType;

int n,m;
bool flag = true ,judge;
ElemType temp,over;
int arr[MaxSize],brr[MaxSize];

//定义单链表
typedef struct LNode{
    ElemType data;
    struct LNode *next;
    int length;
}LNode,*LinkList;

//初始化结点
bool InitLNode(LNode* &s, ElemType e){
    s = (LNode *)malloc(sizeof(LNode));
    s->next = NULL;
    s->data = e;
}

//初始化链表(不带头结点)    头插
LinkList List_HeadInsert(LinkList &L , ElemType e){
    LNode *p;
    cin >> e;
    while(e != -1){
        InitLNode(p , e);
        p->next = L;
        L = p;
        cin >> e;
    }
    return L;
}

//输出链表
void PrintLNode(LinkList L){
    LNode *p = L;
    cout << "该链表的数据为:" << endl;
    while(p){
        cout << p->data << "->";
        p = p->next;
    }
}

//实现算法删除所有值为x的结点(递归)
bool DelectAllNum(LinkList &L , ElemType e){
    LNode *p;
    if(L == NULL)
        return false;
        
    if(L->data == e){
        p = L;
        L = L->next;        //移动的是地址,前驱的next指向的地址更新
        free(p);            //释放地址
        DelectAllNum(L , e);
    }else
        DelectAllNum(L->next , e);
}

int main(){
    LinkList L;
    ElemType x;
    cin >> x;
    InitLNode(L , x);           //这个L是链表第一个结点
    
    List_HeadInsert(L , x);     //头插建立单链表
    PrintLNode(L);              //输出
    
    //实现算法删除所有值为x的结点
    DelectAllNum(L , 11);
    PrintLNode(L);
    
    return 0;
}

运行截图:

王道线性表2.3.7综合题01_第2张图片

 

你可能感兴趣的:(数据结构)