奇数值结点链表

这篇博客介绍了如何实现两个关键函数:一个读取并构造单链表,另一个从输入链表中筛选出奇数节点,形成新的奇数链表。通过实例展示了如何使用`readlist()`和`getodd()`函数处理输入数据并展示输出结果。

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

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:

struct ListNode {
    int data;
    ListNode *next;
};

函数接口定义:

 

struct ListNode *readlist(); struct ListNode *getodd( struct ListNode **L );

函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数getodd将单链表L中奇数值的结点分离出来,重新组成一个新的链表。返回指向新链表头结点的指针,同时将L中存储的地址改为删除了奇数值结点后的链表的头结点地址(所以要传入L的指针)。

裁判测试程序样例:

 

#include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode *next; }; struct ListNode *readlist(); struct ListNode *getodd( struct ListNode **L ); void printlist( struct ListNode *L ) { struct ListNode *p = L; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { struct ListNode *L, *Odd; L = readlist(); Odd = getodd(&L); printlist(Odd); printlist(L); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

1 2 2 3 4 5 6 7 -1

输出样例:

1 3 5 7 
2 2 4 6 
struct ListNode* readlist()
//创建链表读到-1,结束创建;
{
	int i = 0, j = 0, num = 0;
	struct ListNode* p1, * p2, * head = NULL;
	scanf("%d", &num); if (num == -1) return NULL;
	p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
	p1->data = num;
	p1->next = NULL;
	p2 = p1;
	head = p1;
	while (1)
	{
		scanf("%d", &num); if (num == -1)break;
		p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
		p1->data = num;
		p1->next = NULL;
		p2->next = p1;
		p2 = p1;
	}
	return head;
}
struct ListNode* getodd(struct ListNode** L)
//函数getodd将单链表L中奇数值的结点分离出来,重新组成一个新的链表
{
	struct ListNode* p1, * p2, * head1 = NULL,*L2=*L;
	struct ListNode* head2 = NULL, * p1x, * p2x;
	int a[1000] = { 0 }, i = 0, j = 0, count1 = 0;
	int b[1000] = { 0 }, count2 = 0;
	while (L2)
	{
		if (L2->data % 2 == 0)//偶数
		{
			a[i] = L2->data;
			i++, count1++;
		}
		if (L2->data % 2 != 0)//奇数
		{
			b[j] = L2->data;
			j++, count2++;
		}
		L2 = L2->next;
	}

	for (i = 0; i<count1; i++)//偶数链表
	{
		p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
		p1->data = a[i];
		p1->next = NULL;
		if (head1 == NULL)
		{
			head1 = p1;
			p2 = p1;
		}
		else
		{
			p2->next = p1;
			p2 = p1;
		}
	}
    *L = head1;
	for (i = 0; i < count2; i++)
	{
		p1x = (struct ListNode*)malloc(sizeof(struct ListNode));
		p1x->data = b[i];
		p1x->next = NULL;
		if (head2 == NULL)
		{
			head2 = p1x;
			p2x = p1x;
		}
		else
		{
			p2x->next = p1x;
			p2x = p1x;
		}
	}
	return head2;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值