顺序表的c语言实现

#include <stdio.h>
#include <stdlib.h>

// 顺序表

#define INIT_SIZE 100
#define ADD_SIZE  10

typedef int ElemType; // 任意数据类型
typedef int Status;   // 函数返回数据类型

// 动态分配顺序存储结构
typedef struct {
    ElemType * elem;
    int length;       // 当前长度
    int listSize;     // 已分配的存储量
}SqList;

Status InitList_Sq(SqList *L){
    // 构造一个新的线性表

    // malloc 申请一块连续的指定大小的内存分配,返回内存区域地址(开头地址)
    L->elem = (ElemType * )malloc(INIT_SIZE*sizeof(ElemType));
    if(! L->elem) exit(0);    // 若没有分配成功
    L->length = 0;            // 还未开始存储,长度置0
    L->listSize = INIT_SIZE;  // 设置已分配存储量
    return 0;
}

Status ListInsert(SqList *L, int i, ElemType e){
    // 在顺序线性表L中第i个位置之前插入新的元素e
    // 0<i<length+2 (length+1 即在最后插入)

    // 首先判断i是否符合标准
    if(i<1 || i>L->length+1) return -1;
    // 若长度已为最大,进行扩容
    if(L->length >= L->listSize){
        // 首先做了个新指针
        // realloc在特定指针后申请一段新的内存,即扩容
        ElemType *newbase = (ElemType *)realloc(L->elem,
                (L->listSize + ADD_SIZE)*sizeof(ElemType));

        // 若未申请成功
        if(! newbase) exit(0);
        // 旧指针指向新指针
        L->elem = newbase;
        // 总容量更新
        L->listSize += ADD_SIZE;
    }

    // 开始插入
    // 创建指针指向需要插入的地址
    ElemType *q = &(L->elem[i-1]);
    ElemType *p;
    // p指向当前最后一个数据元素地址
    // 需要插入地址后的元素后移
    for(p = &(L->elem[L->length - 1]); p>=q; --p) *(p+1) = *p;

    // 在对应地址赋值e
    *q = e;
    // 当前长度加一
    ++L->length;
    return 0;
}

Status ListDel(SqList *L, int i, ElemType *e){
    // 删除第i个元素,并用e返回其值

    // 判断i是否合法
    if(i<1 || i>L->length+1) return -1;
    // 获得删除位置地址
    ElemType *p=&(L->elem[i-1]);
    // 存储需要返回的值
    *e = *p;
    ElemType *q=&(L->elem[L->length - 1]);
    for(p++; p<=q;  p++) *(p-1)=*(p);
    --L->length;
    return 0;

}

int main()
{
    SqList l;
    InitList_Sq(&l);
    ListInsert(&l,1,10);
    ListInsert(&l,1,20);
    for(int i=0;i<l.length;i++) printf("%d ",l.elem[i]);
    printf("\n");

    ElemType e;
    ListDel(&l,1,&e);
    printf("删除了:%d\n",e);
    for(int i=0;i<l.length;i++) printf("%d ",l.elem[i]);
    printf("\n");

    //printf("%d\n",LocateElem(l,10,(* compare)(l.elem,10)));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值