【指针ha,hb分别是两个加头单向链表a和b的首指针,函数move将表a的第j个结点起的n个结点从a表移动到表b的i结点之后】
#include <stdio.h>
#include <stdlib.h>
typedef struct linkednode // 链表结点类型
{
int data;
struct linkednode * next;
}snode,*ptr;
ptr creatlink() // 向前插入法
{
ptr head,p;
head = NULL;
int x;
scanf("%d",&x);
while(x!=1000)
{
p = (ptr)malloc(sizeof(snode));
p->data = x;
p->next = head;
head = p;
scanf("%d",&x);
}
return (head);
}
void move(ptr ha,ptr hb,int j,int n,int i) // 将表a的第j个结点(不包括j)的n个结点移到b的第i-1个结点之后
{
ptr h,p,q,s,t;
int k = 1;
p = ha;s = p->next;
while(k < j) // 将p移到j结点后面
{
p = s;
s = s -> next;
k ++;
}
q = p;k = 0; // q指向将要移动的第一个结点之前
while(k < n) // p指向要移动的最后一个结点
{
p = s;
s = s -> next;
k ++;
}
t = p; // t指向要移动的最后一个结点
h = q->next;q->next = s; // h指向要移动的第一个结点 将要移动的第一个结点之前的结点的后继改为要移动的最后一个结点的后继结点,也就是把要移动的结点删除
p = hb;s = p->next;
k = 1;
while(k<i) // 将p指向第i个结点,s指向第i+1个结点
{
p = s;
s = s->next;
k ++;
}
p -> next = h; // 链接
t ->next = s;
}
int main()
{
ptr ha,hb,p1,p2;
ha = creatlink();
hb = creatlink();
move(ha,hb,3,2,4);
p1 = ha,p2 = hb;
while(p1!=NULL) // 输出看一下
{
printf("%d ",p1->data);
p1 = p1->next;
}
while(p2!=NULL)
{
printf("%d ",p2->data);
p2 = p2->next;
}
return 0;
}