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

相关推荐
山栀shanzhi8 小时前
C/C++之:构造函数为什么不能设置为虚函数?
开发语言·c++·面试
lsx2024068 小时前
.toggleClass() 方法详解
开发语言
yuan199978 小时前
C&CG(列与约束生成)算法,来解决“风光随机性”下的微网鲁棒配置问题
c语言·开发语言·算法
李白的天不白8 小时前
读到数据为undefind是的几种情况
开发语言·javascript·ecmascript
LeocenaY8 小时前
C语言面试题总结
c语言·开发语言·数据结构
爱吃芹菜炒肉9 小时前
Chapter 16: Power Management
服务器·c语言·网络·tcp/ip·pcie
城管不管9 小时前
嵌入模型Embedding Model
java·开发语言·python·embedding·嵌入模型
Rust研习社9 小时前
Rust Pin 解析:核心原理与异步编程实践
开发语言·后端·rust
Drone_xjw9 小时前
解决 Qt 程序在 Kylin(麒麟)系统下表头“白屏”的问题
开发语言·qt·kylin
运维行者_9 小时前
通过OpManager的Windows服务监控能力释放最佳IT网络性能
服务器·开发语言·网络·windows·web安全·php