已知指针La和Lb分别指向两个无头节点单链表,编写函数完成从La中删除第j个元素开始的共len个元素,并将这len个元素插入到表Lb中第j个元素之前
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode {
ElemType data;
struct LinkNode* next;
}LinkNode, * LinkList;
void creatLinklist(LinkList& L) {
int num;
scanf("%d", &num);
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
L->data = num;
LinkNode* ptail = L;
while (scanf("%d", &num) && num < 99999) {
LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
pnode->data = num;
pnode->next = ptail->next;
ptail->next = pnode;
ptail = pnode;
}
}
void printLinklist(LinkList L) {
LinkNode* pnode = L;
while (pnode != NULL) {
printf("%d ", pnode->data);
pnode = pnode->next;
}
}
/*已知指针La和Lb分别指向两个无头节点单链表,
编写函数完成从La中删除第j个元素开始的共len个元素,并将这len个元素插入到表Lb中第j个元素之前*/
void searchIthnode(int ith, LinkList La, LinkNode*& prenode, LinkNode*& pcurnode) {
LinkNode* preMove = La;
LinkNode* pMove= La->next;
int cnt = 0;
while (pMove != NULL) {
cnt += 1;
if (cnt == ith) {
break;
}
preMove = pMove;
pMove = pMove->next;
}
prenode = preMove;
pcurnode = pMove;
}
void operateLinkList(LinkList& La, LinkList& Lb, int j, int len) {
//为了方便操作,为不带头的链表加上头,注意最好要删除释放头指针
LinkList headLa = (LinkNode*)malloc(sizeof(LinkNode));
LinkList headLb = (LinkNode*)malloc(sizeof(LinkNode));
headLa->next = La;
headLb->next = Lb;
//找到La中第j个元素的前驱和第j个元素
LinkNode* preJnodeLa = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* pcurJnodeLa = (LinkNode*)malloc(sizeof(LinkNode));
searchIthnode(j, headLa, preJnodeLa, pcurJnodeLa);
//找到La中第j+len个元素的前驱和第j+len个元素
LinkNode* preJLennodeLa = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* pcurJLennodeLa = (LinkNode*)malloc(sizeof(LinkNode));
searchIthnode(j+len, headLa, preJLennodeLa, pcurJLennodeLa);
//找到Lb中第j个元素的前驱和第j个元素
LinkNode* preJnodeLb = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* pcurJnodeLb = (LinkNode*)malloc(sizeof(LinkNode));
searchIthnode(j, headLb, preJnodeLb, pcurJnodeLb);
//从La中删除第j个元素开始的共len个元素
preJnodeLa->next = pcurJLennodeLa;
//将这len个元素插入到表Lb中第j个元素之前
preJnodeLb->next = pcurJnodeLa;
preJLennodeLa->next = pcurJnodeLb;
//完成操作后删除并释放头节点
La = headLa->next;
free(headLa);
Lb = headLb->next;
free(headLb);
}
int main() {
LinkList La,Lb;
La = Lb = NULL;
int j, len;
creatLinklist(La);
creatLinklist(Lb);
scanf("%d %d", &j, &len);
operateLinkList(La, Lb, j, len);
printLinklist(La);
printf("\n");
printLinklist(Lb);
return 0;
}