#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;
}
顺序表的c语言实现
于 2023-08-08 15:57:51 首次发布