用c语言实现线性表顺序存储结构,顺序存储结构线性表基本操作 纯C语言实现

自己把顺序表用C语言写了出来,并小试牛刀,做了一题,将La与Lb合并。

#include

#include

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define LIST_INST_SIZE 5

#define LISTINCREMENT 1

typedef int Status;

typedef int ElemType;

typedef struct

{

ElemType *elem;

int length;

int listsize;

} sql;

static ElemType element;

/*函数名:InitList()

参数:sql L

初始条件:无

功能:构造一个空线性表

返回值:存储分配失败:OVERFLOW

存储分配成功:OK*/

Status InitList(sql &L)

{

if((L.elem = (ElemType*)malloc(sizeof(ElemType)* LIST_INST_SIZE)) == NULL)

return OVERFLOW;

else

{

L.length = 0;

L.listsize = LIST_INST_SIZE;

return OK;

}

}

/*函数名:DestroyList()

参数: sql L

初始条件:线性表L已存在

功能:销毁线性表

返回值:L.elem == NULL:ERRor

L.elem != NUll:OK*/

Status DestroyList(sql &L)

{

if(L.elem == NULL)

return ERROR;

else

{

free(L.elem);

return OK;

}

}

/*函数名:ClearList()

参数:sql L;

初始条件:线性已存在表L

功能:清空线性表

返回值:L.elem == NULL :ERROR

L.elem != NULL :OK*/

Status ClearList(sql &L)

{

if (L.elem == NULL) return ERROR;

else

{

L.length = 0;

return OK;

}

}

/*函数名:LIstEmpty()

参数:sql L;

初始条件:线性表存在

功能:判断线性表是否为空

返回:空:TRUE

非空:FALSE*/

Status ListEmpty(sql &L)

{

if (L.length == 0) return true;

else return false;

}

/*函数名:ListLength()

参数:sql L

初始条件:线性表已存在

功能:返回线性表长度

返回值:线性表长度(L.length)*/

Status ListLength(sql &L)

{

return L.length;

}

/*函数名:GetElem()

参数: SqList L, int i,ElemType *e(这里面用了全局变量element)

初始条件:线性表已存在

功能:用e返回线性表第i个元素的值

返回值: (i < 1)||(i > ListLength(L)) : OVERFLOW

1<= i <=ListLength(l) :OK*/

Status GetElem(sql &L, int i,ElemType &e )

{

if ((i < 1)||(i > ListLength(L)) )

return OVERFLOW;

int j;

ElemType *p;

p = L.elem;

for (j = 0; j < i - 1; j++)

L.elem++;

e = *L.elem;

L.elem = p;

return OK;

}

/*函数名:LocateElem()

参数:sql L, ElemType element

初始条件:线性表L已存在

功能:返回顺序表中第一个与element相等的元素的位序

返回值:若L中存在与element相等的元素,则返回 第一个符合条件的元素位序

若不存在,则返回0*/

Status LocateElem(sql &L, ElemType E)

{

int i;

ElemType *p;

p = L.elem;

for (i = 1;i <= L.length; i++)

{

if (*L.elem == E)

{

L.elem = p;

return i;

}

L.elem++;

}

L.elem = p;

return 0;

}

/*函数名:PriorElem()

参数:sql L, Elemtype cur_e, ElemType *pre_e

初始条件:线性表已存在,i>1&&i<=L.length,LocationElem()存在

功能:用pre_e返回线性表中cur_e的前驱

返回值: i<=1||i>L.length:OVERFLOW

i>1&&i<=L.length:OK */

Status PriorElem(sql &L, ElemType cur_e, ElemType *pre_e)

{

ElemType *p = L.elem;

int i;

i = LocateElem(L, cur_e); //为什么 用&L不行 因为这是按引用调用

if (i == 0) return OVERFLOW;

int j;

for (j = 0;j < i - 2; j++)

{

L.elem++ ;

}

*pre_e = *L.elem; //注意 pre_e = L.elem 不行

L.elem = p;

return OK;

}

/*函数名:ListInsert();

参数:sql L, int i, ElemType e

初始条件:线性表L已存在,1 <= i <=L.length + 1;

功能:在线性表第i个元素前插入e

返回值:失败:ERROR

成功:OK */

Status ListInsert(sql &L, int i, ElemType e)

{

int *q = &(L.elem[i - 1]);

ElemType *newbase, *p;

if (i < 1||i > (L.length)+1)

return ERROR;

if (L.length >= L.listsize)

{

newbase = (ElemType*)realloc(L.elem,L.listsize + LISTINCREMENT*sizeof(ElemType)) ;

if (newbase == NULL)

exit(OVERFLOW);

L.elem = newbase;

L.listsize+=LISTINCREMENT;

}

for (p = &(L.elem[L.length - 1]);p >= q; p--)

*(p + 1) = *p;

*q = e;

++L.length;

return OK;

}

/*函数名:ListDelete()

参数:sql L, int i;ElemType *e;

初始条件:线性表L已存在。1<= i <= L.length

功能:删除线性表中第i个元素,并用e返回被删数的值

返回值:失败:ERROR

成功:OK*/

Status ListDelete(sql &L, int i, ElemType &e)

{

if ((i < 1)||(i > L.length))

return ERROR;

e = (L.elem[i - 1]);

ElemType *q;

for (q = &(L.elem[i - 1]); q < &(L.elem[L.length - 1]); q ++ )

{

*q = *(q + 1);

}

L.length--;

return OK;

}

Status ListSee(sql &L)

{

if ((L.elem == NULL)||(L.length==0))

return ERROR;

else

{

int i;

for (i = 0; i < L.length; i++)

{

printf("%d ",L.elem[i]);

}

printf("\n");

}

return OK;

}

Status ListScan(sql &L)

{

int i, a;

printf("enter numbers:");

for (i = 0;i < LIST_INST_SIZE ; i++)

{

scanf("%d",&a);

ListInsert(L, L.length + 1, a);

}

}

int main()

{

sql La, Lb;

int i, e;

InitList(La);

InitList(Lb);

ListScan(La);

ListScan(Lb);

for (i = 0; i < Lb.length; i++)

{

e = Lb.elem[i];

if (!LocateElem(La, e))

ListInsert(La, La.length + 1, e);

// Lb.elem++;

}

printf("La = ");

ListSee(La);

system ("pause");

return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值