顺序表的完整操作(简单快速学会;代码+注释详解)

顺序表是随机存储

/*
#include<stdio.h>
#include<stdlib.h>
#define NULL 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分配增量    
typedef int Status;//Status 是函数类型(当return值为函数结果状态时使用)
typedef char ElemType;
//&表示引用,对原来的进行操作,并在运行时显示
typedef struct {
    ElemType* elem;//存储空间基址,ElemTpype的类型可以改变
    int length;//当前长度
    int listsize;//当前分配的存储容量
    }Sqlist;
//ElemType为用户类型,看题目要求定义(eg:对图书管理,就为Book* elem)
Status Ininlist_Sq(Sqlist& L) {
    //构造一个空的线性链表。
    L.elem = (ElemType * )malloc(LIST_INIT_SIZE * sizeof(ElemType));//分配存储内存
    if (!L.elem)return(OVERFLOW);//存储分配失败;
    L.length = 0;//空表长度为零
    L.listsize = LIST_INIT_SIZE;//初始存储容量
    return OK;
}//Initlist_Sq
Status ListInsert_Sq(Sqlist& L, int i, ElemType e) {
    //在顺序表L中第i个位置前插入新的元素e
    //i的合法值为1<=i<=L.length+1
    ElemType* p, *q,*newbase;
    if (i<1 || i>L.length + 1)return ERROR;//i值不合法
    if (L.length >= L.listsize) { //当前存储已满,需增加分配  
        //c = (int*)relloc(a, b);就是将a的空间给b为整型(实际就是找一个新的地址,开辟空间b,把a放在更大的空间b中,将其内容复制一份给c)
        newbase = (ElemType*)realloc(L.elem, (L.listsize + L.length) * sizeof(ElemType));
        if (!newbase)exit (ERROR);//分配存储内存失败
        L.elem = newbase;//新基址
        L.listsize += LISTINCREMENT;//增加存储容量
    }
    q = &(L.elem[i - 1]);//q为插入位置
    for (p = &(L.elem[L.length - 1]); p >= q; --p)*(p + 1) = *p;//插入位置及以后的元素向后移一位
    *q = e;//插入e
    ++L.length;//表长加一
    return OK;
}//ListInsert_Sq
Status Destorylist_Sq(Sqlist& L) {
    if (!L.elem)return ERROR;//表示表L不存在
    free(L.elem);//若表L存在,回收动态分配的存储空间
    L.elem = NULL;
    L.length = 0;
    L.listsize = 0;
    return OK;
}//Destorylist_Sq
int GetLength_Sq(Sqlist L) {
    return (L.length);
}//GetLength_Sq
int LocateElem_Sq(Sqlist L, ElemType e) {
    //在线性表中L中查找值为e的数据元素,并返回其序号(是第几个元素)
    int i;
    for (i = 0; i < L.length; i++)
        if (L.elem[i] == e)return i + 1;//查找成功,返回序号;
            else return 0;//查找失败,返回0;
}//LocateElem_Sq
Status GetElem(Sqlist L, int i, ElemType& e) {
//在表L中找到第i个元素的值给e,并返回;
    if (i<1 || i>L.length - 1)return ERROR;//判断i值是否合法
    e = L.elem[i - 1];//把第i个值赋给e
    return OK;
}//GetElem_Sq
//顺序表的删除1
Status ListDelete_Sq(Sqlist& L, int i, ElemType& e) {
    //在顺序表L中删除第i个元素,并用e返回其值
    //i的合法值为1<=i<=L.length
    ElemType* p, * q;
    if ((i < 1) || (i > L.length))return ERROR;//i值不合法
    p = &(L.elem[i - 1]);//p为删除元素的位置
    e = *p;//把删除的元素值赋给e返回
    q = &(L.elem[L.length - 1]);//表尾元素的位置
    for (++p; p <= q; ++p)
        *(p - 1) = *p;//删除后元素左移
    ++L.length;//表长加一
    return OK;
}//ListDelete_Sq
//顺序表删除2
Status ListDelete_Sq(Sqlist& L, int i, ElemType& e) {
    //在顺序表L中删除第i个元素,并用e返回其值
    //i的合法值为1<=i<=L.length
    int j;
    if ((i < 1) || (i > L.length))return ERROR;//i值不合法
    e = L.elem[i - 1];//把删除的元素值赋给e
    for (j = i; j <= L.length - 1; j++)
        L.elem[j - 1] = L.elem[j];
    --L.length;
    return OK;
}//ListDelete_Sq
//顺序表合并函数1(直接合并)
void MergeLest_Sq1(Sqlist La, Sqlist Lb, Sqlist& Lc) {
//La,Lb两个表都是递增表,Lc为构建的新表
    ElemType* pa, * pb, * pc,*pa_last,*pb_last;
    pa = La.elem; pb = Lb.elem;
    Lc.listsize = La.length + Lb.length;//Lc当前需要分配的存储容量
    Lc.length= La.length + Lb.length;//表Lc的长度
    pc = Lc.elem = (ElemType*)malloc(Lc.listsize * sizeof(ElemType));//给表Lc分配所需内存.
    if (!Lc.elem)exit(OVERFLOW);//分配内存失败
    pa_last = La.elem + La.length - 1;//表La的最后一个地址
    pb_last = Lb.elem + Lb.length - 1;//表Lb的最后一个地址
    while (pa <= pa_last)*pc++ = *pa++;//在表Lc中增加表La
    while (pb <= pa_last)*pc++ = *pb++;//在表Lc中接着增加Lb
}//MergeLest_Sq1
//顺序表合并函数2(升序合并)
void MergeLest_Sq2(Sqlist La, Sqlist Lb, Sqlist& Lc) {
    //La,Lb两个表都是递增表,Lc为构建的新表
    ElemType* pa, * pb, * pc, * pa_last, * pb_last;
    pa = La.elem; pb = Lb.elem;
    Lc.listsize = La.length + Lb.length;//Lc当前需要分配的存储容量
    Lc.length = La.length + Lb.length;//表Lc的长度
    pc = Lc.elem = (ElemType*)malloc(Lc.listsize * sizeof(ElemType));//给表Lc分配所需内存.
    if (!Lc.elem)exit(OVERFLOW);//分配内存失败
    pa_last = La.elem + La.length - 1;//表La的最后一个地址
    pb_last = Lb.elem + Lb.length - 1;//表Lb的最后一个地址
    while (pa <= pa_last && pb <= pb_last) {
        if (*pa < *pb)*pc++ = *pa++;
        else *pc++ = *pb++;
    }
    while (pa <= pa_last)*pc++ = *pa++;//在表Lc中增加表La
    while (pb <= pa_last)*pc++ = *pb++;//在表Lc中接着增加Lb
}//MergeLest_Sq2
*/

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

回首分离

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值