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

相关推荐
LDR0069 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术9 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园9 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob9 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享9 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.9 天前
C语言--day30
c语言·开发语言
玖玥拾9 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
何以解忧,唯有..9 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽9 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下9 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php