设计并实现一个递归算法,删除不带头节点的单链表L中所有值为y的结点
主要知识点:单链表,数据结构
#include <iostream>
#include<stdio.h>
#include<stdlib.h> //这是用malloc函数的头文件
using namespace std;
//单链表的存储结构
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//头插法建立单链表(无头结点)
LinkList List_HeadInsert(LinkList &L){
LNode *s; int x;
L=NULL; //初始化链表
cout<<"请输入单链表的值(以-1结束输入):"<<endl;
cin>>x; //scanf("%d",&x);*(两种方法输入皆可)
while(x!=-1){ //跳出循环的出口
s=(LNode *)malloc(sizeof(LNode)); //创建新结点
s->data=x;
s->next=L; //连接新结点和头指针
L=s; //让头指针指向新节点
scanf("%d",&x);
}
return L; //返回的是头指针,因为通常用一个头指针来标识一个单链表
}
//递归实现在单链表L中删除值为x的结点
void Del_x(LinkList &L,int x){
LNode *p; //指向待删除的结点
if(L==NULL) return; //递归出口
if(L->data==x){ //若L所指结点的值为x
p=L; //删除*L,并让L指向下一结点
L=L->next;
free(p);
Del_x(L,x); //递归调用
}
else Del_x(L->next,x); //若l所值结点的值不为x,递归调用检查下一个结点
}
//打印单链表的函数
void printL(LinkList L){
int len=0;
while(L!=NULL){
cout<<L->data<<" ";
len++;
L=L->next;
}
//****打印完以后头指针已经指到最后一个位置了,如果直接在主函数里打印&L链表,则只能打印一次!!!
cout<<"\n单链表的长度为:"<<len<<endl;
}
int main() {
LinkList L;
int len=0;
int y; //要删除的结点的值
List_HeadInsert(L);
cout<<"\n建立的单链表为:"<<endl;
printL(L);
cout<<"\n输入要删除的值:";
cin>>y;
cout<<"\n删除值为"<<y<<"的结点后的单链表:"<<endl;
Del_x(L,y);
printL(L);
return 0;
}
运行实列:
版权声明:本文为weixin_50301255原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。