您的位置:首页 > 编程语言 > C语言/C++

学习笔记---线性表的基本操作---顺序存储(C语言)

2012-05-20 22:21 731 查看
#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#define LIST_INIT_SIZE/*线性表存储空间初始分配量*/

#define LISTINCREMENT/*线性表存储空间分配增量*/

#define ok 1

#define OVERFLOW -1

#define false 0

typedef struct {

ElemType *elem;/*存储空间*/

int lenght;/*当前线性表长度*/

int listsize;/*当前分配的存储容量*/

}SqList;

int InitList_Sq(SqList *L)

{ /*构建空线性表*/

L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));/*分配存储空间*/

if(!L->elem)exit(OVERFLOW);/*分配存储空间失败*/

L->lenght=0; /*初始化线性表长度为0*/

L->listsize=LIST_INIT_SIZE;/*初始存储容量*/

return ok;

}

int LenghtList_Sq(SqList *L)

{/*求线性表长度*/

return L->lenght;

}

int DestroyList_Sq(SqList *L)

{

/*销毁线性表*/

free(L->elem);/*释放存储空间*/

L->elem=NULL;/*线性表中元素为0*/

L->length=0;/*线性表长度为0*/

L->listsize=0;/*存储空间为空*/

return ok;

}

int ClearList(SqList *L)

{/*清零操作*/

L->length=0;/*线性表长度为0*/

return ok;

}

int ListEmpty(SqList *L)

{

/*判空操作*/

if(L.length=0)/*线性表长度为0*/

return True;

else

return False;

}

int GetElem(SqList *L,int i,ElemType *e)

{

/*得到第I 个元素的数据元素的值*/

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

return false;

e=*(L->elem+i-1);/*取第i个元素,并赋值给e*/

return ok;

}

int LocateElem(SqList *L,ElemType e,void (*compare)(ElemType,ElemType))

{

/*查找与E相等的元素的位置*/

ElemType *p;

i=1;

while(i<=L->length && !compare(*p++,e))/*判断i所在位置*/

++i;

if(i<=L->length)

return i;

else

return 0;

}

int PriorElem(SqList *L,ElemType cur_e,ElemType pre_e)

{

/*得到给出的数的前一个元素值*/

int i=2;

ElemType *p;

p=L->elem+1;

while(i<=L->length && !(*p++==cur_e))

++i;

if(i>L->length)

return false;

else

{

pre_e=*--p;

return OK;

}

}

int NextElem(SqList L,ElemType pre_e,ElemType cur_e)

{

/* 得到后一个元素的值*/

int i=1;

ElemType *p;

p=L->elem;

while(i<L->length && !(*p++==pre_e))

++i;

if(i>=L->length)

return false;

else

{

cur_e=*++p;

return OK;

}

}

int InsertElem(SqList *L,int i,ElemType e)

{

/*在第I个元素中插入一个值为E的元素*/

int newbase;

SqList *p,*q;

if(i<1 || i>=length+1)/*判断i是否在线性表中*/

return ERROR;

if(L->length>=L->listsize)/*线性表长度大于存储空间长度*/

{

if(!newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)

*sizeof(ElemType))))

return OVERFLOW;

L->elem=newbase;/*新基址*/

L->listsize+=LISTINCREMENT;/*增加存储容量*/

}

p=L->elem+L->length-1;/*线性表长度*/

q=L.elem+i-1;/*第i个元素的前一个位置*/

for(p;p>=q;--p)

*(p+1)=*p;

*q=e;/*赋值给e*/

++L->length;

return ok;

}

int DeleteElem(SqList*L,int i,ElemType e)

{

/* 删除第I个元素*/

SqList *p,*q;

if(i<1 || i>=L->length)

return FALSE;

p=L->elem+i-1;/*第i个元素位置*/

q=L->elem+L->length-1;

e=*p;

for(p;p<=q;++p)

*p=*(p+1);

--L.length;/*线性表长度减一*/

return OK;

}

int ListTraverse(SqList &L,void (*vi)(ElemType))

{

/* 对线性表进行VI的操作*/

int i;

ElemType *p;

p=L.elem;

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

vi(*p++);

return OK;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: