数据结构——链表的部分移动(C语言)
//题设:设指针la和lb分别指向两个无头结点单链表中的首元结点,
// 试设计从表la中删除自第i个元素起拱len个元素,
// 并将它们插入到lb的第j个元素后的算法
//单向链表的实现
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef struct link{
int data; //自定义数据域,此题以int为例
struct link *next;
}*pLink;
/********链表函数*******/
void CreatLink(pLink &S){ //尾插法创建单链表
S=(pLink)malloc(sizeof(pLink));
int x;
pLink s,r=S;
printf("\n请输入链表,以输入-1结束输入:");
scanf("%d",&x);
while(x!=-1){ //当x=-1时表示输入结束
s=(pLink)malloc(sizeof(pLink));
s->data=x;
s->next=NULL;
r->next=s;
r=s; //r指向新的尾节点
scanf("%d",&x);
}
S=S->next; //去掉头结点
}
void Printf(pLink S){ //打印链表
pLink p=S;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
int fun(pLink &la,pLink &lb,int i,int j,int len){
pLink p,q,s,prep,r;
int k;
if(i<0||j<0||len<0) return ERROR;
p=la;
k=1;
prep=NULL;
while(k<i&&p) //在la中查找第i个结点,用p标记
{
prep=p;
p=p->next;
k++;
}
q=p; //q指向la表中第i个结点
while(k<=i+len-2) //查找la表中第i+len-1个结点,用q标记
{
q=q->next;
k++;
}
if(i==1) //i=1的情况
la=q->next;
else
prep->next=q->next; //完成删除
s=lb;
k=1;
while(k<j&&s) //查找lb表中第j个元素 ,用s标记
{
s=s->next;
k++;
}
q->next=s->next;
s->next=p;
return OK;
}
int main(){
pLink la,lb;
CreatLink(la); //创建表la
CreatLink(lb); //创建表lb
int i,j,len;
printf("请输入i j len:");
scanf("%d%d%d",&i,&j,&len);
fun(la,lb,i,j,len);
printf("\nla :");
Printf(la);
printf("\nlb :");
Printf(lb);
return 0;
}