将一个带头结点的单链表A分解为两个带头结点的单链表A和B(A中含有序号为奇数的元素,B中含有序号为偶数的元素)

考研习题第二题

题目:将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A中含有原表中序号为奇数的元素,而B中含有原表中序号为偶数的元素,且保持其相对顺序不变。

算法思想:设置一个访问序号变量(初值为0),每访问一个结点序号自动加一,然后根据序号的奇偶数将结点插入A表或B表中。重复以上操作直到表尾。

代码如下:

LinkList DisCreat_1(LinkList &A){
//将表A中结点按序号的奇偶性分解到表A或表B中
	i=0;	//i记录表A中结点的序号
	B=(Linklist)malloc(sizeof(LNode));	//创建B表表头
	B->next=NULL;	//B表初始化
	LNode *ra=A,*rb=B; 	//ra和rb将分别指向将创建的A表和B表的尾结点
	p=A->next;	//p为链表工作指针,指向待分解的结点
	A->next=NULL;	//置空新的A表
	while(p!=NULL){
		i++;	//序号加1
		if(i%2==0){		//处理序号为偶数的链表结点
			rb->next=p;	//在B表尾插入新节点
			rb=p;	//rb指向新的尾结点
		}
		else{
			ra->next=p; //处理原序号为奇数的结点
			ra=p;		//在A表为插入新节点
		}
		p=p->next;	//将B恢复为指向新的待处理结点
	}				//while结束
	ra->next=NULL;
	rb->next=NULL;
	return B;
}
发布了33 篇原创文章 · 获赞 1 · 访问量 2040

猜你喜欢

转载自blog.csdn.net/m0_45025658/article/details/104964774