//案例
//2.2 稀疏多项式的计算
//结构体嵌套写法
#define MAXSIZE 100 //多项式可能达到最大长度
typedef struct
{
float coef; //系数
int expn; //指数
}Polynomial;
typedef struct
{
Polynomial *elem; //存储空间基地址
int length; //多项式中当前项的个数
}Sqlist; //多项式的顺序存储类型
//2.3 图书表
#define MAXSIZE 10000 //图书表可能达到最大长度
typedef struct
{
char no[20]; //图书ISBN
char name[50]; //图书名称
float price; //图书价格
}Book;
typedef struct
{
Book *elem; //存储空间基地址
int length; //图书表中当前图书的个数
}Sqlist;
//顺序表
#include
#include//malloc函数的头文件
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ET;
#define MAXSIZE 100 //顺序表能达到的最大长度
typedef struct //用结构体表示顺序表Sqlist
{
ET *elem; //存储空间的基地址
//elem为数组指针,初始化后数组空间会由动态分配得到,可以用elem + n得到数组元素
//可以将elem看作数组名,但其实与数组名有差别,《彻底搞定c指针》这本书有讲
ET data[MAXSIZE];//也可以存放数组元素。
这两种当中选一种就好了
int length; //顺序表当前长度
} Sqlist;
//这里注意一下,用c写的话把&改成*,L.elem改成L->elem
//算法2.1 初始化动态分配存储空间
Status InitList(Sqlist *L)//构造一个空的线性表L
{
L->elem =(ET *)malloc(sizeof(ET)*MAXSIZE);
//(ET *)是强制转换类型为ET。
在空间中动态分配出MAXSIZE个ET的空间给线性表L
if(! L->elem) exit(OVERFLOW);
//如果分配失败,就退出并返回OVERFLOW
L->length = 0;//分配成功就能走到这一步,因为此时L为空表,所以当前长度为0
return OK;//分配成功,返回OK
};
//算法2.2 顺序表的取值
Status GetElem(Sqlist L, int i, ET *e)
{//在顺序表L中取第i个值并赋值到e
if(i<1||i>L.length) return ERROR;
//检测i的值是否合理,不合理返回ERROR
e = L.elem[i-1];
//合理就取值,注意数组下标从0开始,所以要-1
return OK;
}
//算法2.1和2.2中的L并不一样
//2.1中L是指向结构体的指针,取值用->
//2.2中L是结构体,取值用.
//2.2中e也用了指针,与2.1中的L一样,在函数中进行 *** 作是可以改变的
//算法2.3 顺序表的查找
//注意Status和int的区别。
虽然Status也是int类型,但是Status返回的是状态,int则返回的是数字
int LocateElem(Sqlist L, ET e)
{//在顺序表L中查找e
for(int i=0;iL->length+1) return ERROR;//i不合理,返回ERROR
if(L->length==MAXSIZE) return ERROR;//当前线性表已满,返回ERROR
for(int j=L->length-1;j>=i;j-- )
L->elem[j+1] = L->elem[j];
//从最后一个元素到第i个元素每个元素都往后移动
L->elem[i-1]=e;//第i个元素赋值为e
++L->length;//当前长度加1
return OK;
}
//算法2.5 删除
Status ListDelete(Sqlist *L, int i)
{//删除顺序表L中的第i个元素
if(i<1||i>L->length) return ERROR;//i不合理,返回ERROR
for(int j=i;jlength;j++)
L->elem[i-1] = L->elem[i];
//从第i个元素到最后一个元素每个元素都往前移动
--L->length;//当前长度减1
return OK;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)