链表的插入和删除——基本操作的变形

本文深入探讨单链表的插入和删除操作的变形,通过实例解析如何处理给定数字串的复杂操作,如插入多个元素和删除指定范围的数字。并提供C++代码实现和运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在初步学习了单链表的基本操作后,有必要进一步掌握单链表基本操作的变形,加深对链表的理解,以下题为例。
Description
给定一串数字然后给定若干插入和删除操作,将操作后的结果输出。
Input第一行:n这串数字有n个(n>=1) 第二行:n个数字表示这串数字第三行:m表示有m个操作后面m行:I a b c1 c2…cb(在第a个数字后插入b个数c1到cb),D a b(删除第a到b个数字,包括b)数字从1开始。Output操作后的结果。每个数字用空格空开。
Sample Input
2 1 3
2
D 3 3
I 1 5 1 2 3 4 5
Sample Output
2 1 2 3 4 5 1

C++代码实现如下:

#include <iostream>
#define N 100
typedef struct LNode
{
 int data;
 struct LNode* next;
}LNode,*LinkList;
LinkList Locate(LinkList L,int i)   //定位链表结点的函数
{
 int j=1;
 LinkList p=L->next;
 if(i==0)
  return L;
 if(i<1)
  return NULL;
 while(p&&j<i)
 {
  p=p->next;
  j++;
 }
 return p;
}
void insert(LinkList L,int i,int n,int x[]) 
/*插入结点的函数,与课堂所学不同的是此题要求按顺序插入元素.例如链表 4->2->3,在第2个位置插入7,8,9后,
若按教材中所讲操作,则链表为4->2->9->8->7->3,但此题要求为4->2->7->8->9->3*/ 
{
 LNode *p,*q;                           
 for(int j=0;j<n;j++)
 {
  q=(LinkList)malloc(sizeof(LNode));
  q->next=NULL;
  q->data=x[j];
  p=Locate(L,i);
  q->next=p->next;
  p->next=q;
  i++;
 }
}
void del(LinkList L,int i,int j)   //删除链表一定范围内结点的函数
{
 for(int k=0;k<j-i+1;k++)
 {
 LNode *p,*q;
 p=Locate(L,i-1);
 q=p->next;
 p->next=q->next;
 free(q);
 }
}
void print(LinkList L)    //按题目要求格式打印链表结点的函数
{
 LinkList p=L->next;
 if(p==NULL)
  printf("LinkList is Null");
 while(p->next)
 {
  printf("%d ",p->data);
  p=p->next;
 }
 printf("%d\n",p->data);
}
int main()
{
 int m,n;
 int b,c,x,y;
 int i;
 int a[N],d[N];
 char str[N];
 LinkList s,r,L=NULL;
 L=(LinkList)malloc(sizeof(LNode));
 r=L;
 scanf("%d",&n);
 for(i=0;i<n;i++)
 {
  scanf("%d",&a[i]);
     s=(LinkList)malloc(sizeof(LNode));
  s->data=a[i];
  r->next=s;
  r=s;
 }
 r->next=NULL;              //创建链表结点
 scanf("%d",&m);            //以下为按题目要求格式输出结果
 for(i=0;i<m;i++)
 {
  scanf("%s",&str[i]);
  if(str[i]=='D')
  {
     scanf("%d%d",&x,&y);
     del(L,x,y);
  }
  if(str[i]=='I')
  {
   scanf("%d%d",&b,&c);
   for(int j=0;j<c;j++)
      scanf("%d",&d[j]);
   insert(L,b,c,d);
  }
 }
 print(L);
 return 0;
}

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值