0
点赞
收藏
分享

微信扫一扫

数据结构(C语言版) 线性表 算法设计Demo17

梦幻之云 2022-05-01 阅读 51

已知指针La和Lb分别是两个带头结点单链表的头指针,下列算法是将表La的第i个元素起的len个元素删除并插入到表Lb的第j(j>=1)个元素之前,试问此算法是否正确?若有错请改正。

void insertsublist(LNode * La,LNode * Lb,int i,int j,int len){
	pre=La;
	pa=La->next;
	k=1;
	while(k<1){
		p=p->next;
		k=k+1;
	}
	s=p;
	while(k<len){
		s=s->next;
		k=k+1;
	}
	pre->next=s->next;
	q=Lb,k=0;
	while(k<j){
		q=q->next;
		k=k+1;
	}
	q->next=p;
	s->next=q->next;
}

代码中存在错误。
(1)为删除La的第i个元素起的len个元素,需要保存第i个元素结点前驱结点的指针。
(2)k在3个循环中的作用是类似的,都是用于累计本次循环中已扫描的元素结点的个数,所以进入第二个循环之前,k要重新赋值,即k=1;
(3)为将子表插在表Lb的第j(j>=1)个元素之前,需要修改Lb的第j-1个元素结点的指针,故第三个循环的循环条件为k<j-1;
(4)将子表插入到表Lb中,修改指针的顺序有误。

void insertsub(LNode * La,LNode * Lb,int i,int j,int len){
	pre=La; // pre指向la的头结点
	p=La->next; // p指向La头结点后的第一个元素
	k=1; // 遍历到La的第i-1个元素,pre指向第i-1个元素,p指向La第i个元素
	while(k<i){
		pre=p;
		p=p->next;
		k=k+1;
	}
	s=p; // s指向La的第i个元素
	k=1;
	while(k<len){
		s=s->next;
		k=k+1;
	}
	pre->next=s->next; // 删除从La的第i个元素起的后len个
	q=Lb; // q指向Lb的头结点
	k=0;
	while(k<j-1){ // 令q指向Lb的第j-1个元素
		q=q->next;
		k=k+1;
	}
	s->next=q->next; // 将La的第i+len-1个元素插入Lb的第j个元素之前
	q->next=p;
}
举报

相关推荐

0 条评论