超详解-线性表顺序存储结构的基本操作(C语言严蔚敏版)

共有11个基本操作函数:

void InitList(SqList * L)//初始化一个空表
void DestroyList(SqList * L)//销毁线性表L
void ClearList(SqList * L)//将L置为空表
Status ListEmpty(SqList * L)//判断L是否为空
int ListLength(SqList * L)//返回L中数据元素的个数(表的长度)
Status GetElem(SqList * L,int i,ElemType * e)//获得表中的第i个元素并用e返回
int LocateElem(SqList * L,ElemType e)//返回L中第一个与e相等元素的位序
Status PriorElem(SqList * L,ElemType cur,ElemType * e)//若cur是L中的元素且不是第一个,用e返回它的前驱元素
Status ListInsert(SqList * L,int i,ElemType e)//在L中第i个位置前插入元素e
Status ListDelete(SqList * L,int i,ElemType * e)//删除L中第i个元素,用e返回
void ListTraverse(SqList * L)//遍历L

代码如下(这里不再写函数声明)
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;//函数返回值类型
typedef int ElemType;//表内存放的数据类型
#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2
typedef struct SqList
{
ElemType * elem;//存储空间的地址
int length;//当前表的长度(元素个数)
int listsize;//分配的存储容量
}SqList;
int main()
{
SqList * L;
return 0;
}

void InitList(SqList * L)//初始化一个空表
{
    L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(L->elem==NULL)
    {
        exit(OVERFLOW);
    }
    L->length=0;
    L->listsize=LIST_INIT_SIZE;
}
void DestroyList(SqList * L)//销毁线性表L
{
    free(L->elem);
    L->elem=NULL;
    L->length=0;
    L->listsize=0;
}
void ClearList(SqList * L)//将L置为空表
{
    L->length=0;
}
Status ListEmpty(SqList * L)//判断L是否为空
{
    if(L->length==0)
        return TRUE;
    else
        return FALSE;
}
int ListLength(SqList * L)//返回L中数据元素的个数(表的长度)
{
    return L->length;
}
Status GetElem(SqList * L,int i,ElemType * e)//获得表中的第i个元素并用e返回
{
    if(i<1||i>L->length)
        return ERROR;
    *e=*(L->elem+i-1);//指针向后移动i-1个单位
    return OK;
}
int LocateElem(SqList * L,ElemType e)//返回L中第一个与e相等元素的位序
{
    int i=1;
    ElemType * p=L->elem;
    while(i<=L->length&&*(p+i-1)!=e)
    {
        i++;
        p++;
    }
    if(i<=L->length)
        return i;
    else
        return 0;
}
Status PriorElem(SqList * L,ElemType cur,ElemType * e)
//若cur是L中的元素且不是第一个,用e返回它的前驱元素
{
    int i=2;
    ElemType * p=L->elem+1;
    while(i<=L->length&&*p!=cur)
    {
        p++;
        i++;
    }
    if(i>L->length)
    {
        return ERROR;
    }
    else
    {
        p--;
        *e=*p;
        return OK;
    }
}
Status ListInsert(SqList * L,int i,ElemType e)
//在L中第i个位置前插入元素e
{
    ElemType *p,*q;
    if(i<1||i>L->length+1)
        return ERROR;
    if(L->length==L->listsize)
    {
        ElemType * newbase;
        newbase=(ElemType *)realloc(L->elem,(L->listsize+LIST_INCREMENT)*sizeof(ElemType));
        if(newbase==NULL)
        {
            exit(OVERFLOW);
        }
        L->elem=newbase;
        L->listsize=L->listsize+LIST_INCREMENT;
    }
    q=L->elem+i-1;
    for(p=L->elem+L->length-1;p>=q;p--)
    {
        *(p+1)=*p;
    }
    *q=e;
    L->length++;
    return OK;
}
Status ListDelete(SqList * L,int i,ElemType * e)//删除L中第i个元素,用e返回
{
    ElemType *p,*q;
    if(i<1||i>L->length)
        return ERROR;
    p=L->elem+i-1;
    q=L->elem+L->length-1;
    *e=*p;
    p++;
    for(p;p<=q;p++)
    {
        *(p-1)=*p;
    }
    L->length--;
    return OK;
}
void ListTraverse(SqList * L)//遍历L
{
    ElemType *p,*q;
    p=L->elem;
    q=L->elem+L->length-1;
    for(p;p<=q;p++)
    {
        printf("%d ",*p);
    }
    printf("\n");
}

你可能感兴趣的:(数据结构)