在初步学习了单链表的基本操作后,有必要进一步掌握单链表基本操作的变形,加深对链表的理解,以下题为例。
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;
}
运行结果