两个单链表的批量插入删除

/*
指针la和lb分别指向两个	无头结点 单链表中的首元结点。
从表la中删除第i个元素起共len个元素,将它们插入到表lb中第j个元素之前。

思路:
找la表的第i-1、i、i+len-1个结点,找lb表第j-1个结点
删除:把la表第i-1的结点指向第i+len的元素
插入:把lb表第j-1的结点指向la表第i个结点,la表第i+len-1的结点指向lb表第j个结点
*/
#include <iostream>
#include <cstdlib> 
using namespace std;
const int OK = 1;
const int INFEASIBLE = -1;
const int flag = -1;
typedef int ElemType;
typedef struct LNode{
	ElemType data;
	struct LNode *next;
}*LinkList;
void List_TailInit(LinkList &L){
	int x;
	LinkList r;
	L = (LinkList)malloc(sizeof(LNode));
	if(cin>>x && x!=flag)	
		L->data = x;
	r = L;
	while(cin>>x && x!=flag){
		LinkList s = (LinkList)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
	}
	r->next = NULL;
}

int DeleteAndInsertSub(LinkList &la, LinkList &lb, int i, int j, int len)
{
	if(i<0 || j<0 || len<0)	
		return INFEASIBLE;
	LinkList prev, p, q, s;
	int k;
	
	//在表la中查找第i个结点p,第i-1个结点prev
	p = la;
	prev = NULL;
	k = 1;
	while(p && k<i)
	{
		prev = p;
		p = p->next;
		k++;
	}
	cout << p->data << "*" << endl; 
	if(!p)	return INFEASIBLE;	//第i-1个结点是尾结点,第i个结点为空
	
	//查找表la中第i+len-1个结点
	q = p;
	k=1;
	while(q && k<len)
	{
		q = q->next;
		k++;
	}
	if(!q)	return INFEASIBLE;
	
	//la表删除
	if(!prev)	la = q->next;	//i=1的情况(删除的结点从第一个结点开始)
	else	prev->next = q->next;
	
	//lb表插入
	if(j==1)	//插入到lb第一个结点前面
	{
		q->next = lb;
		lb = p;
	}
	else
	{
		s = lb;
		k = 1;
		while(s && k<j-1)	//找lb表第j-1个结点
		{
			s = s->next;
			k++;
		}
		if(!s)	return INFEASIBLE;	//要插入到第j个结点前面,但是第j-1个结点就不存在
		q->next = s->next;
		s->next = p;
	}
	return OK;
}

void PrintList(LinkList L)
{
	LinkList p = L;
	while(p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

int main()
{
	LinkList la, lb;
	int i, j, len;
	cout << "输入la表的结点(-1结束):";
	List_TailInit(la);
	cout << "输入lb表的结点(-1结束):";
	List_TailInit(lb);
	cout << "输入i、j、len的值:";
	cin >> i >> j >> len;
	
	cout << "操作之前的la表:";
	PrintList(la);
	cout << "操作之前的lb表:";
	PrintList(lb);
	
	DeleteAndInsertSub(la, lb, i, j, len);
	
	cout << "操作之后的la表:";
	PrintList(la);
	cout << "操作之后的lb表:";
	PrintList(lb);
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值