顺序表的基本操作
程序员文章站
2024-03-20 14:20:28
...
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
/*
顺序表的初始化
*/
Status InitSqList(SqList *L)
{
//分配连续存储空间,初始大小为LIST_INIT_SIZE
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L->elem)
exit(OVERFLOW);
//初始为顺序表为空表,长度为零
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return OK;
}
/*
顺序表的销毁
*/
Status DestroyList(SqList *L)
{
//释放动态分配的连续空间
free(L->elem);
L->elem = NULL;
L->length = 0;
L->listsize = 0;
return OK;
}
/*
清空顺序表,即长度置为零
*/
Status ClearList(SqList *L)
{
L->length = 0;
return OK;
}
/*
返回顺序表的元素个数
*/
int ListLength(SqList L)
{
if(L==NULL){
return ERROR;
}
return L.length;
}
/*
判定顺序表是否为空
*/
Status ListEmpty(SqList L)
{
if(L.length == 0)
return TRUE;
else
return FALSE;
}
/*
取顺序表中第I个元素,并用e带回
*/
Status GetElem(SqList L,int i,ElemType *e)
{
if(i<1 || i>L.length)
return ERROR;
*e = L.elem[i-1];
return OK;
}
/*
在顺序表中第I个位置插入元素e
*/
Status ListInsert(SqList *L,int i,ElemType e)
{
ElemType *newbase;
int j;
//参数i不合法
if(i<1 || i>L->length+1)
return ERROR;
//若空间已满,则重新分配空间,增加一个分配增量LISTINCREMENT
if(L->length >= L->listsize)
{
newbase = (ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT) * sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
//元素后移
for(j=L->length;j>=i;j--)
L->elem[j] = L->elem[j-1];
//插入元素e,并且长度加1
L->elem[i-1] = e;
L->length ++;
return OK;
}
/*
删除顺序表中第I个元素,并用e带回
*/
Status ListDelete(SqList *L,int i,ElemType *e)
{
int j;
//参数i不合法
if(i<1 || i>L->length)
return ERROR;
//带回被删除元素值
*e = L->elem[i-1];
//元素前移
for(j=i;j<L->length;j++)
L->elem[j-1] = L->elem[j];
//顺序表长度减1
L->length --;
return OK;
}
/*
输出顺序表每个元素
*/
void ListPrint(SqList L)
{
int i;
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
}
上一篇: 顺序表的基本操作
下一篇: EasyExcel的导入和导出