数据结构代码笔记 2顺序表

//案例
//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<stdio.h>
#include<stdlib.h>//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;i<L.length;i++)
        if(L.elem[i] == e) return i+1;//若存在则返回e所在位置序号
    return 0;//不存在返回0
}

//算法2.4 插入
Status ListInsert(Sqlist *L, int i, ET e)
{//在顺序表的第i个位置插入e元素
    if(i<1||i>L->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;j<L->length;j++)
        L->elem[i-1] = L->elem[i];
    //从第i个元素到最后一个元素每个元素都往前移动
    --L->length;//当前长度减1
    return OK;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值