1.设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
自己写的:
该代码有段错误,不清楚什么原因,求指导。
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
//定义单链表
typedef struct Node{
int data;//数据域
struct Node* next;//指针域
}Node,*LinkList;//声明点 声明链表
//得到位序为i的结点
Node *GetElem(LinkList L,int i){
if(i<1)//异常值
return NULL;
Node *p=L;
int j=1;//不带头结点
while(p!=NULL&&j<=i){
p=p->next;
j++;
}
return p;
}
//输出打印
void print(LinkList L){
Node*p=L;
while(p!=NULL){
cout<<p->data<<endl;
}
}
//得到值为x的结点
Node* GetX(LinkList L,int x,int &i){//i返回一个它的位置
Node*p=L;
i=1;//没有头结点
while(p!=NULL&&p->data!=x){
p=p->next;
i++;
}
return p;//是有可能等于NULL的
}
//删除值为x的结点
void DeleteXNode(LinkList &L,int x){//假设数据类型是整形,方便验证。ElemType
/*找到这个值p,找到前驱q,q->next=p->next,free(p)*/
int i=0;
Node*p,*q=(Node*)malloc(sizeof(Node));
p=GetX(L,x,i);
q=GetElem(L,i-1);
q->next=p->next;
free(p);
}
int main(){
LinkList L;
L=NULL;
int x=5;
int g;//要插入的数
Node*s,*r;
r=(Node*)malloc(sizeof(Node));
scanf(“%d”,&g);
while(g!=9999){
s=(Node*)malloc(sizeof(Node));
s->data=g;
r->next=s;
s=r;
scanf(“%d”,&g);
}
r->next=NULL;
print(L);
DeleteXNode(L,x);
print(L);
}
王道给的递归:
这个理解起来还是容易,但是我想不出来。
它是不会断层的,我的理解是每个标号都给 它取名为L,而L的每次next都是指向了后面的数的。
相当于感觉好像每次都在从头结点开始往后寻找。
void Delete_X_recursion(LinkList &L,int x){
if(L==NULL){
return;//链表都为空了
}
if(L->data==x){//如果第一个元素就是x,直接删除
Node*p=L;
L=L->next;
delete(p);
Delete_X_recursion(L,x);
}else{//否则从第二个开始看
Delete_X_recursion(L->next,x);
}
}