单链表的拆分

本文介绍了一种将单链表按元素奇偶性拆分为两个子链表的方法,并提供了完整的C语言实现代码。该方法确保了每个子链表内的元素顺序与原链表保持一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构实验之链表五:单链表的拆分
Time Limit: 1000MS Memory limit: 65536K
题目描述
输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。
输入
第一行输入整数N;;
第二行依次输入N个整数。
输出
第一行分别输出偶数链表与奇数链表的元素个数;
第二行依次输出偶数子链表的所有数据;
第三行依次输出奇数子链表的所有数据。
示例输入
10
1 3 22 8 15 999 9 44 6 1001
示例输出
4 6
22 8 44 6
1 3 15 999 9 1001
<pre name="code" class="cpp"># include <stdio.h>
# include <stdlib.h>
struct node{
	int data;
	struct node *next;
};
typedef struct node Node;

Node* create_link_list(int len);
int get_link_list_length(Node*L);
void split_link_list(Node*L1,Node*L2,Node*L);
void display_link_list(Node*L);

int main()
{
	int n,len,len1,len2;
	Node* L,*L1,*L2;
	scanf("%d",&n);
	/*区分结构体指针,和指向的节点*/
	L1 = (Node*)malloc(sizeof(Node));//1
	L2 = (Node*)malloc(sizeof(Node));//2
	L = create_link_list(n);

	split_link_list(L1,L2,L);
	len1 = get_link_list_length(L1);
	len2 = get_link_list_length(L2);
	printf("%d %d\n",len1,len2);
	display_link_list(L1);
	display_link_list(L2);
	
	//display_link_list(L);
	//len=get_link_list_length(L);
	//printf("%d\n",len);
	return 0;
}
/*顺序建表*/
Node* create_link_list(int len)
{
	Node*head;
	Node*tail;
	Node*p;
	head = (Node*)malloc(sizeof(Node));
	tail = head;
	while(len--)
	{
		p = (Node*)malloc(sizeof(Node));
		scanf("%d",&(p->data));
		tail->next = p;
		tail = p;
		p->next = NULL;
	}
	return head;
}

void split_link_list(Node*L1,Node*L2,Node*L)
{
	/*开始放在该函数中,错误!!
	L1 = (Node*)malloc(sizeof(Node));
	L2 = (Node*)malloc(sizeof(Node));     error;
	*/
	Node*tail1,*tail2;
	Node*p;
	p = L->next;
	tail1 = L1;
	tail2 = L2;
	while(p)
	{
		if(p->data%2 == 0)
		{
			tail1->next = p;
			tail1 = p;
			p = p->next;
		}
		else
		{
			tail2->next = p;
			tail2 = p;
			p = p->next;
		}
	}
	tail1->next = NULL;
	tail2->next = NULL;
}

int get_link_list_length(Node*L)
{
	int len=0;
	Node*p;
	p = L->next;
	while(p)
	{
		len++;
		p = p->next;
	}
	return len;
}

void display_link_list(Node*L)
{
    Node*p;
    p = L->next;
    while(p)
    {
		if(p->next)
		{
			printf("%d ",p->data);
		}
		else
		{
			printf("%d\n",p->data);
		}
		p = p->next;
	}
}





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值