链表操作(链表头插,头删,中间删,尾删的见解和连续删除的见解)

目录

问题描述

问题分析

链表的头插

链表的删除

​编辑 代码演示

源码

运行结果

扩展

使用类

源码

运行结果


更多链表操作请访问

问题描述

【问题描述】
输入n(n>1)个正整数,每次将输入的整数插入到链表头部。-1表示输入结束。再输入一个正整数,在链表中查找该数据并删除对应的节点。要求输出进行删除操作后链表中所有节点的值。
【输入形式】
输入以空格分隔的n个整数,以-1结束输入,再输入一个要删除的整数。

【输出形式】
从链表第一个元素开始,输出链表中所有的节点值。以空格分隔。

【样例输入】

2 4 6 7 8 4 -1
2

【样例输出】

4 8 7 6 4

问题分析

链表的头插

       头插:首先有三个结构体指针 p1,p2,head,head指向第一个结构体,p1和p2为操作指针。还需要类似如下的结构体num。

e96a98d629a044bcb0f652f88f644448.png

1.第一步,p1开辟一个结构体并指向它,然后这个结构体的next指针为空。

1840b0293fe54fa5bad2ef58d61b03e7.jpeg

2. 第二步,p2开辟一个结构体并指向它。

9aaf0043e133435f8020314c5f04f5dc.jpega040523603634e3485ec3c19db0dda23.jpeg

 3.第三步,p2的next指针指向p1指向的结构体。

34aedd6e58cc44c598e9483ce0f89f70.jpeg

 第四步,p1,p2,head共同指向p2指向的结构体。

d67ec91c76a44c268a3e96cd19901d4d.jpeg

 第五步,p2再开辟一个指针并指向它

687e937c318646b4a64e391ce3b0e576.jpeg

 第六步,p2指向结构体的next指向 p1和head指向的结构体。

74745a85a5754a88974b591872e2da7d.jpeg

 第七步,p1,p2,head共同指向p2指向的结构体。2ab266f55e074851b765e48a2772dd62.jpeg

 这就是头插了。

链表的删除

首先需要遍历链表

1.头部删除,head=head->next,让head指向之前头指针指向结构体的下一个结构体。(因为p1和p2是操作指针所以不用管它们)

删除前:

78ad2d530e834adbbb366a083ecef72a.png

 删除后

b5c65546929f4c84b8d351f9b1f00926.png

 2.中间删除,让操作指针p1对链表进行遍历,并且让p2之向p1之前的结构体,p1找到目标结构体,如下图。

7916270e43924b3cb829a4c9b15decd1.png

然后p2->next=p1->next,如下图。

4253441626d841b29ac4d12791dbc687.png

3.尾部删除,让操作指针p1对链表进行遍历,并且让p2之向p1之前的结构体,p1找到目标结构体,如下图。

49c64d26f4624f788168b8d81770e11e.png

然后p2->next=NULL,如下图。

d4a496b9d5474fb7927a7e714da4cdcc.png 代码演示

源码

#include<stdio.h>
#include<stdlib.h>
struct num{
	int n;
	struct num *next;
};
int main()
{
	int n,m;
	struct num *p1,*p2,*p3,*head;
	p1=(struct num *)malloc(sizeof(struct num));
	scanf("%d",&n);
	if(n!=-1)
	{
		p1->n=n;p1->next=NULL;m=1;
	}
	else return 0;
	while(1)
	{
		scanf("%d",&n);
		if(n==-1)break;
		p2=(struct num *)malloc(sizeof(struct num));
		p2->n=n;
		p2->next=p1;
		p1=p2;
		head=p2;
		m++;
	}
	int N;
	scanf("%d",&N);int k=1;
	p1=head;
	while(p1!=NULL)
	{
		if(k==1&&p1->n==N)
		{
			head=head->next;m--;
			p2=head;
			p1=p1->next;
		} 
		else if(k>1&&k<m&&p1->n==N)
		{
			p2->next=p1->next;m--;
			p1=p1->next;
		}
		else if(k==m&&p1->n==N)
		{ 
			p2->next=NULL;m--;
		}
		else {
			k++;
			p2=p1;
			p1=p1->next;
		}
	}
	p1=head;
	while(p1!=NULL)
	{
		printf("%d ",p1->n);
		p1=p1->next;
	}
	
} 

运行结果

365f33b0a5884e5f9b08056054709ffe.png

扩展

完成头部,中间,尾部相结合的链表连续删除

d76b30898a9b49c68cbd97b763c16572.png

 3f0099e948d749b1845151a16a1e83e4.png

欢迎指正。

使用类

源码

#include<iostream>
using namespace std; 
typedef struct num{
	int n;
	struct num *next;
}list;
class A
{
	private:
		list *head;
		int N;
	public:
		void fin()
		{
			cout<<"请输入元素:"<<endl;
			int n;
			list *p1,*p2;
			p1=new list; 
			cin>>n;
			if(n!=-1)
			{
				p1->n=n;
				p1->next=NULL;
				N=1;
				head=p1;
			}
			else 
			{
				head=NULL;
				N=0;
			}
			while(1)
			{
				cin>>n;
				if(n==-1)break;
				p2=new list;
				p2->n=n;
				p2->next=p1;
				p1=p2;
				head=p2;
				N++;
			}
		}
		void tin()
		{
			cout<<"请输入元素:"<<endl;
			int n;
			list *p1,*p2;
			p1=new list; 
			cin>>n; 
			if(n!=-1)
			{
				p1->n=n;
				p1->next=NULL;
				N=1;
				head=p1;
			}
			else 
			{
				head=NULL;
				N=0;
			}
			while(1)
			{
				cin>>n;
				if(n==-1)break;
				p2=new list;
				p2->n=n;
				p2->next=NULL;
				p1->next=p2;
				p1=p2;
				N++;
			}
		}
		void delete1()
		{
			list *p1,*p2;
			int m;cout<<"输入要删除的整数:"; 
			cin>>m;int k=1;
			p1=head;
			while(p1!=NULL)
			{
				if(k==1&&p1->n==m)
				{
					head=head->next;N--;
					p2=head;
					p1=p1->next;
				} 
				else if(k>1&&k<N&&p1->n==m)
				{
					p2->next=p1->next;N--;
					p1=p1->next;
				}
				else if(k==N&&p1->n==m)
				{ 
					p2->next=NULL;N--;
				}
				else {
					k++;
					p2=p1;
					p1=p1->next;
				}
			}
		}
		void display()
		{
			list *p1=head;
			while(p1!=NULL)
			{
				printf("%d ",p1->n);
				p1=p1->next;
			}
		}
};
int main()
{
	A t;
	int c;
	cout<<"1.头插		2.尾插"<<endl<<"输入1或2:"; 
	cin>>c; 
	if(c==1)t.fin();
	else t.tin();
	t.delete1();
	t.display();
}

运行结果

e4473772a77e40ce9ee828d9f79d7256.png

6e70aacba2a0455a88376c76bb01cd94.png

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓零清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值