当前位置: 首页 > news >正文

数据结构——多项式问题(顺序存储结构or链式存储结构)

补充:malloc函数:

malloc 函数是 C 语言标准库中的一个重要函数,位于 <stdlib.h> 头文件中,主要用于在程序运行时动态分配内存。以下将详细介绍其用法。

前面的返回值指针可以自己定义,如  (int*)malloc....

优点:

  • 动态内存分配(堆上分配)的优势:使用 malloc 函数可以在堆上动态分配内存。堆上的内存不会随着函数的结束而自动释放,只要不调用 free 函数,这块内存就会一直存在。因此,MakeEmpty 函数能够返回一个指向堆上分配的内存的指针,调用者可以在后续的程序中持续使用这块内存。
  • 自动分配的固定生命周期:栈上分配的变量生命周期与函数的执行周期紧密相关。一旦函数结束,变量就会失效,无法在函数外部继续使用。
  • 动态分配的可控生命周期:使用 malloc 分配的内存,其生命周期由程序员手动管理。程序员可以在需要的时候分配内存,在不再使用时通过 free 函数释放内存。这使得程序能够根据实际需求灵活地管理内存,避免了内存的浪费或泄漏。
  • 动态分配允许多个实例:在实际应用中,可能需要创建多个线性表实例。使用 malloc 可以多次调用 MakeEmpty 函数,每次都会在堆上分配一块新的内存,从而创建多个独立的线性表实例。

一、对于一个一元多项式,我们如何用c语言表示它?还有我们如何用c语言对他进行相加减、相乘?

关键数据:多项式项数n

                  各项系数a(i),以及指数i;

1.如何表示多项式?

(1)顺序存储结构直接表示:

数组各分量对应多项式各项:下标代表指数:

但是如果遇到指数很大的多项式怎么办?

(2)顺序存储结构二元组:

用结构数组表示,数组分量是由系数a(i)和指数i组成的结构;

(3)链式结构存储:

链表中每个结点存储多项式中的一个非零项,包括系数和指数以及指向下个结点的指针;

typedef struct PoleNode*Polynomial;   //对结构体的指针重命名
struct PolyNode    //定义结构体
{
    int coef;    //系数
    int expon;   //指数
    Polynomial link;   //指向下一个结构体的指针
};

2.线性表的顺序存储实现:

利用数组的连续存储空间顺序存放线性表的各元素:

typedef struct LNode*List;    //定义结构体指针;
struct LNode
{
    ElementType Data[MAXSIZE];   //定义存放数据的数组
    int Last;  //作为计数工具;
};
struct LNode L;   //定义结构体L
List Ptrl;   //定义结构体指针Ptrl

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode*List;
struct LNode1
{
    ElementType Data[MAXSIZE];
    int Last;
};
struct LNode L;
List Ptrl;

List MakeEmpty()   //初始化线性表
{
    List Ptrl;   //定义一个结构体指针;
    Ptrl = (List)malloc(sizeof(struct LNode));
    Ptrl->Last = -1;
    return Ptrl;
}   //得到一个初始化的结构体的指针;

int Find(ELementType X, List Ptrl)   //实现查找功能;传入要查找的值以及结构体数组地址;
{
    int i = 0;
    while(i <= Ptrl->Last && Ptrl->Data[i] != X)    //从0到last进行查找
        i++;
    if(i > Ptrl->Last) 
        return -1;
    else return i;    //返回查找值的下标;
}

void Insert(ElementType X, int i, List Ptrl)    //实现插入功能;传入插入对象,插入位置;
   int j;       
    if(Ptrl->Last == MAXSIZE - 1)  //达到最大内存,无法插入
    {
        printf("表满");
        return;
    }
    if(i < 1 || i > Ptrl->Last+2}  
       {
           printf("位置不合法");
       return;
       }
    for(j = Ptrl->Last; j >= i-1; j--)   //从最后位置开始
        Ptrl->Data[j + 1] = Ptrl->Data[j];   //将元素向后移
    Ptrl->Data[i-1] = X;   //插入元素
    Ptrl->Last++;   //改变大小标记
    return;
    
void Delete(int i, List Ptrl)   //实现删除功能
{
    int j;
    if(i < 1||i>Ptrl->Last+1)  
    {
        printf("不存在第%d个元素", i);
        return;
    }
    for(j = i; j <= Ptrl->Last; j++)
        Ptrl->Data[j-1] = Ptrl->Data[j];    //将要删除的值用下一个值覆盖,实现删除功能
    Ptrl->Last--;
    return;
}
 

相关文章:

  • 【Python修仙编程】(二) Python3灵源初探(8)
  • 8.大模型微调学习案例:基于 Hugging Face、8位量化与 LoRA 适配器的方案
  • doris: SQL Server
  • vue3中ref和reactive的区别
  • C 语 言 --- 数 组 (1)
  • Orale数据文件加错位置,你直接rm引发的故障
  • java后端开发day28--常用API(三)时间类包装类
  • npm install -g @vue/cli 方式已经无法创建VUE3项目
  • 论文阅读_LMLPA_用大语言模型实现人格评测
  • 我的世界forge模组开发(9)——自定义投掷物实体
  • c#事件案例与分析
  • 解决电脑问题(10)——桌面问题
  • js逆向-某网站cookies生成逻辑分析_2025-03-08
  • element-plus中table组件的使用
  • 【2025软考高级架构师】——软件工程(2)
  • Java的数据类型
  • 小程序 wxml 语法 —— 41列表渲染 - 进阶用法
  • 一个基于.NET Core开源、跨平台的仓储管理系统
  • 【学习笔记】【DeepSeek AI 医生】2-2 AI家庭医生课程内容介绍
  • 扩散模型中三种加入条件的方式:Vanilla Guidance,Classifier Guidance 以及 Classifier-Free Guidance
  • 做网站的人叫什么/站长之家工具查询
  • 无锡宜兴网站建设/软文发布门户网站
  • 商城网站建设可以吗/网站推广和网站优化
  • 甜品网站首页设计/电脑优化大师官方免费下载
  • 公众号里的电影网站怎么做的/青岛seo精灵
  • 加盟餐饮网站建设/大连seo关键词排名