王道数据结构课后代码题p40 10.将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变(c语言代码)

 设置一个访问变量(初值为0),每访问一个结点序号自动加1,然后根据序号的奇偶性将结点插入到A表或B表中,用while循环重复以上操作直到表尾

本题代码如下

linklist discreat(linklist* L)
{
	lnode* B = (lnode*)malloc(sizeof(lnode));//创建B表的表头
	B->next = NULL;//B表初始化
	int i = 0;
	lnode* p = (*L)->next;//p为工作指针
	lnode* ra = *L,*rb=B;//ra指向A表尾,rb指向B表尾
	while (p != NULL)
	{
		i++;
		if (i % 2 == 0)//处理偶数序列的链表结点
		{
			rb->next = p;
			rb = p;
		}
		else//处理原序号为奇数的结点
		{
			ra->next = p;
			ra = p;
		}
		p = p->next;//p指向下一个待处理的结点
	}
	ra->next = NULL;
	rb->next = NULL;
	return B;
}

完整测试代码

#include
#include
typedef struct lnode
{
	int data;
	struct lnode* next;
}lnode,*linklist;
int n = 6;
int a[6] = { 1,2,3,4,5,6 };
void buildlinklist(linklist* L)
{
	*L = (lnode*)malloc(sizeof(lnode));
	(*L)->next = NULL;
	lnode* s = *L, * r = *L;
	int i = 0;
	for (i = 0; i < n; i++)
	{
		s = (lnode*)malloc(sizeof(lnode));
		s->data = a[i];
		s->next = r->next;
		r->next = s;
		r = s;
	}
	r->next =NULL;
}
linklist discreat(linklist* L)
{
	lnode* B = (lnode*)malloc(sizeof(lnode));//创建B表的表头
	B->next = NULL;//B表初始化
	int i = 0;
	lnode* p = (*L)->next;//p为工作指针
	lnode* ra = *L,*rb=B;//ra指向A表尾,rb指向B表尾
	while (p != NULL)
	{
		i++;
		if (i % 2 == 0)//处理偶数序列的链表结点
		{
			rb->next = p;
			rb = p;
		}
		else//处理原序号为奇数的结点
		{
			ra->next = p;
			ra = p;
		}
		p = p->next;//p指向下一个待处理的结点
	}
	ra->next = NULL;
	rb->next = NULL;
	return B;
}
void print(linklist* L)//输出单链表
{
	lnode* q = (*L)->next;
	while (q)
	{
		printf("%d ", q->data);
		q = q->next;
	}
}
int main()
{
	linklist L,B;
	buildlinklist(&L);
	printf("原始单链表为:");
	print(&L);
	B=discreat(&L);
	printf("\nA链表为:");
	print(&L);
	printf("\nB链表为:");
	print(&B);
	return 0;
}

你可能感兴趣的:(王道课后习题单链表,数据结构,c语言,算法,链表)