YTU OJ 2221: 两个链表之间问题(线性表)

题目描述

已知两个单链表A和B,其头指针分别为heada和headb,编写一个过程从单链表A中删除自第i个元素起的共len个元素,然后将单链表A插入到单链表B的第j个元素之前。

输入

前三个数分别表示i,len,j

一个整数m,表示A链表的长度m。

m个数表示A链表中的m个数据元素。

一个整数n,表示B链表的长度n。

n个数表示B链表中的n个数据元素。

输出

操作后的结果。

样例输入
1 3 5
11
13 5 14 62 3 43 71 5 72 34 5
15
5 20 3 53 7 81 5 42 6 8 4 6 9 10 23

样例输出
5 20 3 53 62 3 43 71 5 72 34 5 7 81 5 42 6 8 4 6 9 10 23

采用C++方式提交

#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode
{
	int data;
	struct Lnode *next;
}LinkNode;
void Init(LinkNode *&L)	//初始化链表
{
	L=(LinkNode *)malloc(sizeof(LinkNode));
	L->next=NULL;
}
void Delete(LinkNode *&L,int i,int len) //从单链表A中删除自第i个元素起的共len个元素
{
	LinkNode *p=L,*pre,*q,*r;
	int j=0,k=0;
	while(j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}
	q=p->next;
	pre=q;
	while(k<len-1)
	{
		r=pre;
		pre=r->next;
		k++;
		free(r); //释放结点
	}
	p->next=pre->next;
}
void Creat(LinkNode *&L,int n) //创建链表(尾插法)
{
	LinkNode *r,*p;
	int i=0;
	r=L;
	for(i=0;i<n;i++)
	{
		p=(LinkNode *)malloc(sizeof(LinkNode));
		scanf("%d",&p->data);
		r->next=p;
		r=p;
	}
	r->next=NULL;
}

void Print(LinkNode *L) //输出
{
	while(L!=NULL)
	{
		printf("%d ",L->data);
		L=L->next;
	}
	printf("\n");
}
void Insert(LinkNode *&heada,LinkNode *&headb,LinkNode *&head,int j) //将单链表A插入到单链表B的第j个元素之前
{
	LinkNode *p=heada,*q=headb,*r;
	int i=0;
	if(j==1) //当插入位置为1时,表示将A链表和B链表链接,A的尾结点指向B的首结点
	{
		headb=headb->next;
		while(p->next!=NULL)
		{
			p=p->next;
		}
		p->next=headb;
		head=heada; //将合并后的链表的头结点设为heada的头结点
	}
	else
	{
		head=headb; //因为插入位置不为1,所以合并后的链表的头结点必定为headb的头结点
		while(i<j-1 && q!=NULL) //找到插入位置;
		{
			i++;
			q=q->next;
			r=q->next; //保存插入位置的后一个元素,用以和单链表B连接
		}
		p=p->next; //将A的头结点变为首结点,因为头结点不存放数据
		q->next=p; //合并,B的插入位置的结点与A的首结点连接
		while(p->next!=NULL)
		{
			p=p->next; 
		}
		p->next=r; //A的尾结点与B插入位置的后一个结点连接
	}
}
int main()
{
	int i,len,j,m,n;
	LinkNode *heada,*headb,*head;
	Init(heada); //初始化
	Init(headb);
	scanf("%d %d %d",&i,&len,&j);
	scanf("%d",&m);
	Creat(heada,m); //创建A链表
	scanf("%d",&n);
	Creat(headb,n); //创建B链表
	Delete(heada,i,len); //从单链表A中删除自第i个元素起的共len个元素
	Insert(heada,headb,head,j); //将单链表A插入到单链表B的第j个元素之前
	Print(head->next); //输出
	return 0;
}

你可能感兴趣的:(YTU OJ 2221: 两个链表之间问题(线性表))