#include<malloc.h> // malloc()等
#include<stdio.h> // NULL, printf()等
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
//-------- 线性表的动态分配顺序存储结构 -----------
#define LIST_INIT_SIZE 100 //顺序表存储空间初始尺寸
#define LIST_INCREMENT 10 //顺序表存储空间分配增量
typedef int ElemType; //顺序表元素的数据类型为整数
//存储结构定义:顺序表
typedef struct {
ElemType *elem; //存储表元素的数组指针
int length; //表长度
int listsize; //数组尺寸
} SqList;
初始化空顺序表L:
//运算1:初始化空顺序表L
Status InitList(SqList &L) {// 算法2.3
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //分配数组空间
if (!L.elem) return OVERFLOW; //若分配失败,函数结束(返回值=-2)
L.length=0; //表长度初值为0
L.listsize=LIST_INIT_SIZE; //表空间初始尺寸
return OK;
}
销毁顺序表L:
//运算2:销毁顺序表L
void DestroyList(SqList &L) {
free(L.elem); //释放表的数组存储空间
L.elem=NULL; //清空指向数组的指针及表示表长度、数组尺寸的指示变量
L.length=0;
L.listsize=0;
}
在顺序表L中第i个位置前插入新元素e:
//运算3:在顺序表L中第i个位置前插入新元素e
Status ListInsert(SqList &L,int i,ElemType e) { //算法2.4
ElemType *newbase;
if(i<1||i>L.length+1) return ERROR; //若指定的插入位置i值不合法,则退出函数
if(L.length>=L.listsize){ //当前表元素数组已满,增加数组空间的分配
newbase=( ElemType *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType));
if (!newbase) return OVERFLOW; // 存储分配失败
L.elem=newbase; // 新基址
L.listsize+=LIST_INCREMENT; // 增加存储容量
}
删除L的第i个元素,并用e返回其值://运算4:删除L的第i个元素,并用e返回其值
Status ListDelete(SqList &L,int i,ElemType &e) {//算法2.5
if(i<1||i>L.length) return ERROR; //若i值不合法,则退出函数
e=L.elem[i-1];
for(int j=i-1; j<L.length -1; j++) L.elem[j]=L.elem[j+1];
L.length--; // 表长减1
return OK;
}
返回L中数据元素个数:
//运算5:返回L中数据元素个数
int ListLength(SqList L) {
return L.length;
}
用e返回L中第i个元素的值:
//运算6:用e返回L中第i个元素的值
Status GetElem(SqList L,int i,ElemType &e) {
if(i<1||i>L.length) return ERROR;
e=L.elem[i-1];
return OK;
}
查找指定值元素位置:
//运算7:查找指定值元素位置
Status Equal(ElemType t1,ElemType t2)
{
if(t1==t2)
return OK;
return ERROR;
}
int LocateElem(SqList L,ElemType e,Status (*compare)(ElemType t1,ElemType t2))
{
for(int i=1;i!=L.length+1;i++)
if((*compare)(L.elem[i-1],e))//函数指针的用法
return i;
return 0;
}
其他:
//--- 插入新元素 ---
for(int j=L.length-1; j>=i-1; j--) L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;
L.length++; //表长度增1
return OK;
}
//辅助函数:显示顺序表元素
//写法1:
void print(SqList L) {
for(int i=1; i<=L.length; i++) {
printf("%5d", L.elem[i-1]);
}
printf("\n");
}
//写法2:
//print中不能直接访问顺序表的内部结构,只能通过运算ListLength、GetElem间接访问;
void print(SqList L)
{
ElemType e;
int x=ListLength(L);
for(int i=1; i<=x; i++)
{
GetElem(L,i,e);
printf("%5d",e);
}
printf("\n");
}
Main函数:
void main(void) {
SqList L; //声明顺序表变量
InitList(L);
//****具体操作****
print(L);
DestroyList(L);
}