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

相关推荐
书到用时方恨少!2 小时前
Python os 模块使用指南:系统交互的瑞士军刀
开发语言·python
我是大猴子2 小时前
事务失效的几种情况以及是为什么(详解)
java·开发语言
呜喵王阿尔萨斯2 小时前
argc & argv
c语言·c++
爱编码的小八嘎3 小时前
C语言完美演绎6-1
c语言
她叫我大水龙3 小时前
MSYS2的C/C++,python2,python3编译环境安装脚本
c语言·c++
武藤一雄3 小时前
C#:nameof 运算符全指南
开发语言·microsoft·c#·.net·.netcore
带娃的IT创业者3 小时前
WeClaw_40_系统监控与日志体系:多层次日志架构与Trace追踪
java·开发语言·python·架构·系统监控·日志系统·链路追踪
Y001112363 小时前
JDBC原理
java·开发语言·数据库·jdbc
发疯幼稚鬼3 小时前
大整数乘法运算
c语言·算法