C语言程序设计第四版(何钦铭、颜晖)第十一章指针进阶之奇数值结点链表

  1. 奇数值结点链表:输入若干个正整数(输入-1为结束标志)建立一个单向链表,头指针为L,将链表L中奇数值的结点重新组成一个新的链表NEW,并输出新建链表的信息。试编写相应程序。

第一种方案:

复制代码
#include<stdio.h>
#include<stdlib.h>

struct num_node {
    int x;
    struct num_node *next;
};

int main() {
    int a;
    struct num_node *L = NULL, *NEW = NULL, *p = NULL, *s = NULL, *q = NULL;
    
    // 输入链表
    scanf("%d", &a);
    while(a != -1) {
        p = (struct num_node*)malloc(sizeof(struct num_node));
        p->x = a;
        p->next = NULL;
        if(L == NULL) {
            L = p;
            s = L;
        } else {
            s->next = p;
            s = p;
        }
        scanf("%d", &a);
    }
    
    // 从原链表中提取奇数节点,组成新链表
    p = L;
    q = NULL;  // q 用于追踪新链表的尾节点
    while(p != NULL) {
        if(p->x % 2 != 0) {  // 如果是奇数
            s = (struct num_node*)malloc(sizeof(struct num_node));
            s->x = p->x;
            s->next = NULL;
            
            if(NEW == NULL) {
                NEW = s;
                q = NEW;
            } else {
                q->next = s;
                q = s;
            }
        }
        p = p->next;  // 关键:移动原链表指针
    }
    
    // 输出新链表(只含奇数)
    q = NEW;
    while(q != NULL) {
        printf("%d ", q->x);
        q = q->next;
    }
    printf("\n");
    
    // 释放内存(可选,但好习惯)
    // 释放原链表
    p = L;
    while(p != NULL) {
        struct num_node* temp = p;
        p = p->next;
        free(temp);
    }
    // 释放新链表
    q = NEW;
    while(q != NULL) {
        struct num_node* temp = q;
        q = q->next;
        free(temp);
    }
    
    return 0;
}

输入样例:1 2 3 4 5 6 7 8 9 -1

输出结果:1 3 5 7 9

第二种方案:

复制代码
#include<stdio.h>
#include<stdlib.h> 

struct num_node{
    int x;
    struct num_node *next;
};

struct num_node *createList(struct num_node *head);
struct num_node *Insert_node(struct num_node *head,struct num_node *p);
struct num_node *Select_node(struct num_node *head);
void print(struct num_node *head);
void free_node(struct num_node *head);


int main()
{
    struct num_node *L=createList(NULL),*NEW=Select_node(L);
    print(NEW);
    free_node(L);
    free_node(NEW);
	return 0;
}


//创建链表
struct num_node *createList(struct num_node *head){
    int a;
    struct num_node *p=NULL;
    scanf("%d",&a);
    while(a!=-1){
        p=(struct num_node*)malloc(sizeof(struct num_node));
        p->x=a;
        p->next=NULL;
        head=Insert_node(head,p);
        scanf("%d",&a);
    }
    return head;
}


//插入结点
struct num_node *Insert_node(struct num_node *head,struct num_node *p){
    struct num_node *s=head;
    if(head==NULL){
        head=p;
        s=head;
    }
    else{
        while(s->next!=NULL){
            s=s->next;
        }
        s->next=p;
        s=p;
    }
    return head;
}


//摘取奇数结点形成新的链表
struct num_node *Select_node(struct num_node *head){
    struct num_node *NEW=NULL,*p=head,*s=NULL,*q=NULL;
    while(p!=NULL){
        if(p->x%2!=0){
            s=(struct num_node *)malloc(sizeof(struct num_node));
            s->x=p->x;
            s->next=NULL;
            if(NEW==NULL){
                NEW=s;
                q=NEW;
            }
            else{
                q->next=s;
                q=s;
            }
        }
        p=p->next;
    }
    return NEW;
}


//打印链表
void print(struct num_node *head){
    struct num_node *q=head;
    while(q!=NULL){
        printf("%d ",q->x);
        q=q->next;
    }
}


//释放结点
void free_node(struct num_node *head){
    struct num_node *q=head,*temp=NULL;
    while(q!=NULL){
        temp=q;
        q=q->next;
        free(temp);
    }
}

输入样例:1 2 3 4 5 6 7 8 9 11 13 -1

输出结果:1 3 5 7 9 11 13

相关推荐
zmzb010313 小时前
C++课后习题训练记录Day157
开发语言·c++
dunge202614 小时前
2026年7月最新ChatGPT Plus / Pro 与 Codex:当 AI Agent 最新5.6版本来袭,必须理解事务、幂等与补偿
开发语言·人工智能·python
爱吃牛肉的大老虎15 小时前
rust基础之环境搭建
java·开发语言·rust
openKylin15 小时前
与全球技术演进同频,openKylin 3.0从C迈向Rust
c语言·开发语言·rust·开源·开放原子·openkylin
迷茫、Peanut16 小时前
C语言sizeof和strlen
c语言
疯狂打码的少年16 小时前
【软件工程】结构化设计:模块独立性与耦合内聚
java·开发语言·笔记·软件工程
程高兴16 小时前
PMSM基于在线转动惯量辩识的滑模负载转矩观测器MATLAB-SIMULINK仿真模型
开发语言·matlab
kisloy17 小时前
【python零基础教程第24讲】代码规范与质量管控
开发语言·python
C++、Java和Python的菜鸟17 小时前
第4章 后端Web基础(基础知识)
java·开发语言
芷栀夏17 小时前
Java教育平台实战复盘:课程、考试与学习行为分析系统设计
java·开发语言·学习