You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言typedef struct用法及二次方程根存入自定义roots类型方法

一、C语言中typedef struct的使用方式

typedef struct的核心作用是给结构体类型起简洁别名,避免重复书写struct 结构体名的繁琐,主要有两种常见写法:

  1. 匿名结构体直接typedef
    就像你代码里的写法,直接定义匿名结构体并赋予别名:

    typedef struct {
        double m, n;
    } roots;
    

    之后可直接用roots作为类型名定义变量:

    roots my_roots;    // 定义roots类型的变量
    roots *p_roots;    // 定义指向roots类型的指针
    

    这种写法适合不需要在结构体内部引用自身的场景(比如无需构建链表、树这类递归结构)。

  2. 带标签的结构体typedef
    如果结构体需要在内部引用自身(比如链表节点),必须给结构体加标签后再typedef:

    struct Node {
        int value;
        struct Node *next;  // 需用struct Node引用自身
    };
    typedef struct Node Node;  // 给struct Node起别名Node
    

    后续即可用Node替代struct Node:

    Node *head;  // 定义链表头指针
    
二、二次方程根存入自定义roots类型的实现

你的代码存在两个核心问题:函数声明返回roots*但未返回有效指针;未处理判别式小于0的异常情况。以下是两种可行的实现方案:

方案1:动态分配内存返回指针

在函数内用malloc分配roots类型内存,计算根后赋值,最终返回指针。注意调用方需手动释放内存避免泄漏。

#include <math.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct { 
    double m, n; 
} roots;

roots *quadratic_formula(int a, int b, int c) {
    // 计算判别式,强制转double避免int溢出
    double discriminant = (double)b*b - 4*a*c;
    
    // 判别式小于0,无实根,返回NULL
    if (discriminant < 0) {
        return NULL;
    }
    
    // 分配内存并检查是否成功
    roots *result = (roots*)malloc(sizeof(roots));
    if (result == NULL) {
        return NULL;
    }
    
    // 计算根并赋值
    double sqrt_d = sqrt(discriminant);
    result->m = (-b + sqrt_d) / (2.0 * a);
    result->n = (-b - sqrt_d) / (2.0 * a);
    
    return result;
}

// 使用示例
int main() {
    roots *r = quadratic_formula(1, -3, 2);
    if (r != NULL) {
        printf("根1:%lf,根2:%lf\n", r->m, r->n);
        free(r);  // 必须释放内存
    } else {
        printf("无实根或内存分配失败\n");
    }
    return 0;
}

方案2:传入结构体指针修改内容

由调用方提前定义roots变量,将指针传入函数直接修改值,无需动态分配内存,避免泄漏风险。

#include <math.h>
#include <stdio.h>

typedef struct { 
    double m, n; 
} roots;

// 返回1表示计算成功,0表示无实根或参数无效
int quadratic_formula(int a, int b, int c, roots *result) {
    if (result == NULL) {
        return 0;
    }
    
    double discriminant = (double)b*b - 4*a*c;
    if (discriminant < 0) {
        return 0;
    }
    
    double sqrt_d = sqrt(discriminant);
    result->m = (-b + sqrt_d) / (2.0 * a);
    result->n = (-b - sqrt_d) / (2.0 * a);
    
    return 1;
}

// 使用示例
int main() {
    roots r;
    if (quadratic_formula(1, -3, 2, &r)) {
        printf("根1:%lf,根2:%lf\n", r.m, r.n);
    } else {
        printf("无实根\n");
    }
    return 0;
}

关键注意点

  • 计算判别式时强制将b*b转为double,避免大整数相乘导致的int溢出。
  • 分母用2.0 * a而非2*a,确保运算为浮点数除法,避免精度丢失。
  • 方案1必须调用free释放内存,否则会造成内存泄漏。

内容的提问来源于stack exchange,提问作者Igneous Chunk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 04:17:14