奇数值结点链表
发布日期:2021-06-29 11:18:04 浏览次数:3 分类:技术文章

本文共 2360 字,大约阅读时间需要 7 分钟。

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

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

函数接口定义:

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

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

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

裁判测试程序样例:

#include 
#include
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() {
struct ListNode *head = NULL, *p, *pre;//pre保存当前结点的前驱结点 int n; scanf("%d", &n); while (n != -1) {
p = (struct ListNode *) malloc(sizeof(struct ListNode)); p->data = n; p->next = NULL;//新结点的指针域设为NULL if (head == NULL) head = p; else pre->next = p;//前驱结点的指针域设为当前新建结点的地址 pre = p;//把pre设为p,作为下个结点的前驱结点 scanf("%d", &n); } return head;//返回头结点}struct ListNode *getodd(struct ListNode **L) {
//head1,p1,pre1为奇数值结点链表 //head2,p2,pre2为偶数值结点链表 //两个链表的操作类似struct ListNode *readlist()函数 struct ListNode *head1 = NULL, *head2 = NULL, *p1, *p2, *pre1, *pre2; while (*L) {
//逐个读取链表所有结点 if ((*L)->data % 2) {
//奇数值 p1 = (struct ListNode *) malloc(sizeof(struct ListNode)); p1->data = (*L)->data; p1->next = NULL; if (head1 == NULL) head1 = p1; else pre1->next = p1; pre1 = p1; } else {
//偶数值 p2 = (struct ListNode *) malloc(sizeof(struct ListNode)); p2->data = (*L)->data; p2->next = NULL; if (head2 == NULL) head2 = p2; else pre2->next = p2; pre2 = p2; } *L = (*L)->next;//读取下一个结点 } *L = head2;//将L中存储的地址改为删除了奇数值结点后的链表的头结点地址 return head1;//返回指向新链表头结点的指针}

转载地址:https://blog.csdn.net/zxc0074869/article/details/115208700 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:单链表结点删除
下一篇:通讯录排序

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月07日 05时11分45秒