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

Posted 华辰永利

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版) 线性表 算法设计Demo17相关的知识,希望对你有一定的参考价值。

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

设i>=1,len>=1,i+ListLength(La),1<=j<=ListLength(Lb)。

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;

以上是关于数据结构(C语言版) 线性表 算法设计Demo17的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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