教授先生带你学习链表:链表节点的删除与增添2

教授先生带你学习链表:链表节点的删除与增添2,第1张

教授先生带你学习链表:链表节点的删除与增添2

本篇博客是在上一篇博客的基础上扩展的,希望读者在阅读完以下这个链接内容后再看这一篇

(9条消息) 教授先生带你学习链表:初识链表1_教授先生的博客-CSDN博客

描述:

给一串数字,用链表结构进行存储,然后给定针对该链表的若干删除 *** 作。要求将执行删除 *** 作后的结果输出。

输入要求:

第一行:输入一个整数n。表示这串数字有n个(n大于等于1)。

第二行:输入这n个整数。

第三行:输入一个整数m。表示需要执行m次删除 *** 作。(m<=n)

后面m行:每行输入一个整数a,表示要删除当前链表中的第a个数字。(假设链表中第一个节点的编号为1)。

输出要求:

执行了m次删除 *** 作中。输出剩下的n-m个数字。每个数字用空格空开。

输入样例:

3

2 1 3

2

1

1

输出样例

3

#include
#include 
using namespace std;
	int m,n;
struct node{
	int data;//数据
	node* next;//指向下一结点 
}; 
void build(node* head)
{
	node*p=head,*q;
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		q=new node;
		scanf("%d",&q->data);//或者*(q).data q->next(*q).next
		p->next=q;//连接,每个head的next指针内容已经装下了下个节点的首地址   
		p=q; 
	}
	p->next=NULL;
}
//删除的自定义函数 
void del(node* head,int x)//传递的是参数head的地址,和第几个(x)后面的数字 
{
	//从第一个节点开始寻找到要删除的节点前一个位置时就终止 
	for(int i=1;inext!=NULL)head=head->next;//将下一个head结构体的地址赋给head,可以理解为把节点相连接,连接起来就可以连续地使用它 
		//因为在创建链表时,每个head的next指针内容已经装下了下个节点的首地址  
		else return; //1,如果 head的next指针内容不是空,就将节点连接,
		//2,如果为空,则return 直接退出这个del函数,什么也不做(说明要删除的节点位置超出该链表的实际节点)删除失败,说明x位节点不存在
	}
	if(head->next==NULL) return;//上面那个for循环是检测第1个到第x-1个的next是否为空
	//从这个if开始判断第x个是否为空,1,若为空,直接退出del函数,上面也不做 ,说明x位节点不存在 head在x-1位置
	head->next=head->next->next; //2,若不为空,则x位节点存在,
	//先看赋值号右边,计算完右边的数值再赋给左边, 
	//先把右边的head->next->next 提取出来 ,从左边数 head->next表示的是第 x个节点的next指针(实际存储的是下一个节点的首地址),
	//head->next等价于 第(x+1)个结构体的首地址(自己理解一下)
	//然后 (head->next)->next 表示 第(x+1)个结构体的next指针(实际存储的是第(x+2)个结构体的首地址) 
	//回到赋值号左边,将第(x+2)个结构体的首地址赋给next,
	//所以此处赋值号左边的 head->next 指的是将第x个 结构体的 结构体指针 指向 第(x+2)个结构体的首地址
	//这样就实现了链表不与第(x+1)个结构体相连接的功能 
	 
}
void show (node*head)//演示 
{
	while(head->next!=NULL)
	{
		head=head->next;
		printf("%d",head->data);
		if(head->next==NULL)printf("n");
		else printf(" ");
	}
	
}
int main(void)
{

	 node* head;
	             //      head=(node*)malloc(sizeof(node));//  如果是c语言就要写 #include 这个头文件写这句话,不要下面c++那个 
	 head=new node;//c++,这个和上面那个是等价的,都是分配动态指针内存,这道题是c++,用new来分配动态指针内存 
	 build(head);
	 scanf("%d",&m);
	 while(m--)
	 {
	 	int x;
	 	scanf("%d",&x);
	 	del(head,x);//用这个删除的函数,传递参数 
	    
	  } 
	 show(head);//演示的函数 
	 return 0;
 } 

 

 

题目描述:

给定一串数字,用链表结构进行存储。然后给定针对该链表得若干插入 *** 作,要求将执行插入 *** 作后的结果输出。

输入要求:

第一行:输入一个整数n,表示这串数字有n个(n大于等于1)。

第二行:输入这n个整数。

第三行:输入一个整数m,表示需要执行m个插入 *** 作。

后面m行:每行输入两个整数a和b。表示在这串数字的当前第a个数字之后插入数字b。(假设链表第一个节点编号为1)

输出要求

输出 *** 作后的n+m个数字,每个数字用空格空开(最后一个数字后面没有空格,直接换行)

输入样例

3

2 1 3

2

1 5

1 6

输出样例

2 6 5 1 3

#include
#include 
using namespace std;
	int a,b,n,m;
struct node{
	int data;//数据
	node* next;//指向下一结点 
}; 
void build(node* head)
{
	node*p=head,*q;
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		q=new node;
		scanf("%d",&q->data);//或者*(q).data q->next(*q).next
		p->next=q;//连接
		p=q; 
	}
	p->next=NULL;
}
//插入函数代码 
void insert(node* head,int a,int b)//表示第a个插入位置插入b数字 
{
	for(int i=1;i<=a;++i)
	{//从第一个结构体开始寻找到第a个结构体,如果head的next指针不为空,则  连接起来 
		if(head->next!=NULL)head=head->next;
		else return;//如果为空,说明选择要插入的位置大于这个链表的最大位置,则插入失败,退出函数 
	}
	node*p=new node;//定义一个新的结构体指针并为它分配内存空间 
	p->data=b; //把要输入的b数值赋给 这个新的结构体指针存储数据的部分区域,data 
	
	
	//head在a位置
	//不能交换顺序(下面这两行) 
	p->next=head->next;//先看赋值号右边  head->next表示的是 下一个结构体的首地址
	//将下个头文件首地址赋给 p这个插入的结构体的指针  (完成了p的尾部和第a+1个结构体的连接) 
	head->next=p;//将第a个结构体的指针与p的首地址相互连接(完成了p的头部与第a个结构体的尾部连接) 
	
}
void show (node*head)
{
	while(head->next!=NULL)
	{
		head=head->next;
		printf("%d",head->data);
		if(head->next==NULL)printf("n");
		else printf(" ");
	}
	
}
int main(void)
{

	 node* head;
	 //head=(node*)malloc(sizeof(node));//c语言 #include 
	 head=new node;//c++ 
	 build(head);
	 scanf("%d",&m);
	 while(m--)
	 {
	 	int x;
	 	scanf("%d%d",&a,&b);
	 	insert(head,a,b);
	    
	  } 
	 show(head);
	 return 0;
 } 

 创作不易,感谢你的支持。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5718901.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存