数据结构——链表的部分移动(C语言)

数据结构——链表的部分移动(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;
} 

猜你喜欢

转载自blog.csdn.net/qq_41596568/article/details/83057181