小言_互联网的博客

设计算法删除链表中之为x的节点

506人阅读  评论(0)
//设计算法删除链表中之为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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场