博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第1章第2节练习题1 递归删除指定结点
阅读量:4961 次
发布时间:2019-06-12

本文共 2103 字,大约阅读时间需要 7 分钟。

问题描写叙述

设计一个递归算法,删除不带头节点的单链表L中全部值为x的结点。

算法思想

由于题目要求使用递归的方式删除指定结点,那么我们能够先列出递归的基本模型:

指针p指向要删除的结点,指针q则为要删除结点的后继结点。

递归出口

if(p==NULL){        return;    }

递归主体

if(p->data==x){            p->data=q->data;            p->next=q->next;            free(q);            DelNodeX(p,x);    }else{        DelNodeX(p->next,x);    }

由于本题中,没有设置头节点。当删除的时候必须从第一个结点開始删除。因此我们參考中的来实现该算法。

应当注意到假设最后一个结点的数据域为x时,须要差别对待。此时,指针q为空,假设继续运行p->data=q->data时明显会出错。但也由于是最后一个结点,此时仅仅需将指针p直接赋值为NULL便可。

算法描写叙述例如以下:

算法描写叙述

void DelNodeX(LNode *p, ElemType x){    if(p==NULL){        return;    }    LNode*  q=p->next;    if(p->data==x){        if(q!=NULL){            p->data=q->data;            p->next=q->next;        }else{            p=NULL;        }        free(q);        DelNodeX(p,x);    }else{        DelNodeX(p->next,x);    }}

详细代码见附件


附件

#include
#include
typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;}LNode,*LinkList;LinkList CreatList();void DelNodeX(LNode*,ElemType);void Print(LNode*);int main(int argc,char* argv[]){ ElemType e=3; LNode *p; p=CreatList(); Print(p); DelNodeX(p,e); Print(p); return 0;}//尾插法建立单链表LinkList CreatList(){ LNode *p; LNode *s; ElemType x; scanf("%d",&x); p=(LNode*)malloc(sizeof(LNode)); p->data=x; LNode *r=p; while(1){ scanf("%d",&x); if(x==999){ break; } s=(LNode*)malloc(sizeof(LNode)); s->data=x; r->next=s; r=s; } r->next=NULL; return p;}//删除指定节点void DelNodeX(LNode *p, ElemType x){ if(p==NULL){ return; } LNode* q=p->next; if(p->data==x){ if(q!=NULL){ p->data=q->data; p->next=q->next; }else{ p=NULL; } free(q); DelNodeX(p,x); }else{ DelNodeX(p->next,x); }}//打印全部节点void Print(LNode *p){ while(p){ printf("%4d",p->data); p=p->next; } printf("\n");}

注:此种解法存在一个Bug,当最后一个或最后多个连续结点均为数据域为x的结点时,会留下一个数据域为x的结点,眼下个人暂没想到解决的方法,改天再想。

转载于:https://www.cnblogs.com/jzssuanfa/p/7359807.html

你可能感兴趣的文章
struts2.x + Tiles2.x读取多个xml 配置文件
查看>>
Sqlite文件在ubunut的查看
查看>>
表单校验之datatype
查看>>
python第六篇文件处理类型
查看>>
kettle 数据库连接失败
查看>>
ListView失去焦点选中行不能高亮显示的问题解决
查看>>
# jsp及servlet学习笔记
查看>>
Kconfig详解
查看>>
(四)hadoop系列之__hadoop搭建(单机配置)
查看>>
nodejs爬虫数据存入mysql
查看>>
sphinx2.8.8的配置文件
查看>>
Visual Studio 2019 正式版 更新内容
查看>>
4、下行短信发送WebService、下行短信发送服务 -功能详细设计 --短信平台
查看>>
Failure to find com.oracle:ojdbc6:jar
查看>>
文本去重-----awk或者uniq
查看>>
Android学习笔记三:Intent实现页面跳转
查看>>
Django下JWT的使用
查看>>
React Native 的组件之底部导航栏 TabBarIOS(一)
查看>>
聊聊、SpringBoot 上传文件大小
查看>>
WF 学习笔记 (1) - 浅谈 WF 和 MVC 架构
查看>>