//设计算法删除链表中之为x的节点
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct slist
{
int data;
struct slist *next;
}list;
void creatlist(list *&l);//创建单链表
void printlist(list *l);//打印单链表
void deletelist_x1(list *&l,int x);//删除算法1
void deletelist_x2(list *&l,int x);//删除算法2
int main(void)
{
list *l;
/*creatlist(l);
int x;
cout<<"请输入要删除的值:"<<endl;
cin>>x;
deletelist_x1(l,x);
printlist(l);
cout<<endl;*/
int x;
cin>>x;
list *l1;
creatlist(l1);
deletelist_x2(l1,x);
printlist(l1);
return 0;
}
void deletelist_x2(list *&l,int x)
{
list *p = l,*t;
while(p->next != NULL)
{
if(p->next->data == x)
{
t = p->next ;//先保存再删除 指针的动态变化
p->next = t->next ;
delete t ;//前驱结点不用移动 因为他还是前驱结点。。。。
}
else
{
p = p->next ;
}
}
}
void deletelist_x1(list *&l,int x)
{
list *pre = l,*p = pre->next,*t;
while(p != NULL)//用哪个判断数据就用哪个判断是否为空 画图就明白了
{
if(p->data == x)
{
t = p->next ;//先保存再删除 因为我后面p 要下移 pre 不用 因为他永远是前驱指针
pre->next = p->next ;
free(p);
p = t;//p指针下移一个单位
}
else
{
pre = p;
p = p->next ;
}
}
}
void creatlist(list *&l)
{
list *r,*s;
l = new list;
r = l;
cout<<"请输入数据项:"<<endl;
int x;
cin>>x;
while(x != 0)
{
s = new list;
s->data = x;
r->next = s;
r = s;
cin>>x;
}
r->next = NULL;
}
void printlist(list *l)
{
if(l->next == NULL)
{
cout<<"单链表为空:";
}
else
{
list *p = l->next ;
while(p != NULL)
{
cout<<p->data <<" ";
p = p->next ;
}
}
}
转载:https://blog.csdn.net/qq_44653420/article/details/102408800
查看评论