补充: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;
}