IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 习题11-7 奇数值结点链表 (20 分) -> 正文阅读

[数据结构与算法]习题11-7 奇数值结点链表 (20 分)

浙大版《C语言程序设计(第3版)》题目集

习题11-7 奇数值结点链表 (20 分)

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

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:

1 2 2 3 4 5 6 7 -1

输出样例1:

1 3 5 7 
2 2 4 6 

二、题解

c代码

struct ListNode *readlist() {   //构成链表
    struct ListNode *p, *q, *head = NULL;
    int n;
    while(scanf("%d", &n) == 1 && n != -1) {  //一直读入n,直到n为-1
        p = (struct ListNode *)malloc(sizeof (struct ListNode));  //p指向一个新开的空间
        p -> data = n;      //p的data为n
        p -> next = NULL;   //把p的下一位置成空
        if(head) {  //不是第一个数
            q -> next = p;  //使q的下一位是新开的空间p
            q = p;   //q再指向新开的空间,不会被覆盖,此时q的上一位next指向新开的空间
        } else {      //是第一个数
            head = q = p;   //使head,q等于p,指向那个新开的空间
        }
    }
    return head;
}

struct ListNode *getodd( struct ListNode **L ) {
    struct ListNode *ohead = NULL, *p1, *p;
    struct ListNode *dhead = NULL, *p2;
    for ( p = *L ; p ; p = p -> next ) {  //遍历链表
        if(p -> data % 2) {    //当前节点的值等于m
            if(!ohead)  ohead = p1 = p;     //奇数链表第一个节点,使头节点指向当前节点p
            else {     //不是第一个节点
                p1 -> next = p;     //使节点p1的下一个节点为p节点
                p1 = p;        //使p1指向当前节点p
            }
        } else {
            if(!dhead)  dhead = p2 = p;  //偶数链表第一个节点,使头节点指向当前节点p
            else {    //不是第一个节点
                p2 -> next = p;      //使节点p2的下一个节点为p节点
                p2 = p;         //使p2指向当前节点p
            }
        }
    }
    //上面的代码当链表不为空时,没有把p1,p2的下一位指向空,在这里指向一下
    if(ohead)  p1 -> next = NULL;  
    if(dhead)  p2 -> next = NULL;
    *L = dhead;   //把偶数链表表头付给*L,*L指向L的地址
    return ohead;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:34:33  更:2021-08-08 11:35:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:29:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码