顺序线性表的实现

SqList.h

//函数结果状态代码

#define    TRUE    1

#define    FALSE    0

#define    OK        1

#define    ERROR    0

#define    INFEASIBLE    -1

#define    OVERFLOW    -2

//Status是函数的类型,其值是函数结果状态代码

typedef int Status;

typedef int ElemType;





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

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



typedef struct{

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

    int            length;            //当前长度

    int            listsize;        //当前分配的存储容量(以sizeof(ElemType)为单位)

}SqList;



Status InitList_Sq(SqList &L){

    //构造一个空的线性表L。

    L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

    if(!L.elem)    exit(OVERFLOW);                //存储分配失败

    L.length=0;                                //空表长度为0

    L.listsize=LIST_INIT_SIZE;                //初始存储容量

    return OK;

}//InitList_Sq



Status ListInsert_Sq(SqList &L,int i,ElemType e){

    int *newbase,*q,*p;

    if(i<1||i>L.length+1)    return ERROR;        //i值不合法

    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;                //增加存储容量

    }

    q=&(L.elem[i-1]);                            //q为插入位置

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

                                                //插入位置及之后的元素右移

    *q=e;                //插入e

    ++L.length;            //表增长

    return OK;

}//InitList_Sq



Status ListDelete_Sq(SqList &L,int i,ElemType &e){

    //在顺序线性表L中删除第i个元素,并用e返回其值

    //i的合法值为1<=i<=ListLength_Sq(L)

    int *p,*q;

    if((i<1)||(i>L.length))    return ERROR;    //i值不合法

    p=&(L.elem[i-1]);                        //p为被删除元素的位置

    e=*p;                                    //被删除元素的值赋给e

    q=L.elem+L.length-1;                    //表尾元素的位置

    for(++p;p<=q;++p)    *(p-1)=*p;            //被删除元素之后的元素左移

    --L.length;                                //表长减1

    return OK;

}//ListDelete_Sq



int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)){

    //在顺序线性表L中查找第1个值与e满足compare()的元素的位序

    //若找到,则返回其在L中得位序,否则返回0

    int i=1;

    int *p=L.elem;

    while(i<=L.length && !(*compare)(*p++,e))    ++i;

    if(i<=L.length)    return i;

    else    return 0;

}//LocateElem_Sq



int Compare_Sq(ElemType e1,ElemType e2){

    //比较两个ElemType类型的元素是否相等。相等返回1,否则返回-1。

    if(e1==e2)    

        return 1;

    else    

        return 0;

}//Compare_Sq



void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){

    //已知顺序线性表La和Lb的元素按值非递减排序

    //归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排序

    int *pa,*pb,*pc;

    int *pa_last,*pb_last;

    pa=La.elem;

    pb=Lb.elem;

    Lc.listsize=Lc.length=La.length+Lb.length;

    pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));

    if(!pc)    exit(OVERFLOW);            //存储分配失败

    pa_last=La.elem+La.length-1;

    pb_last=Lb.elem+Lb.length-1;

    while(pa<=pa_last && pb<=pb_last){    //归并

        if(*pa<=*pb)    *pc++=*pa++;

        else    *pc++=*pb++;

    }

    while(pa<=pa_last)    *pc++=*pa++;    //插入La的剩余元素

    while(pb<=pb_last)    *pc++=*pb++;    //插入Lb的剩余元素

}//MergeList_Sq

 

#include "stdafx.h"

#include "stdlib.h"

#include "stdio.h"

#include "malloc.h"



#include "SqList.h"



int main(int argc, char* argv[])

{

    SqList L;

    int s1=123,s2=456;

    int l;



    InitList_Sq(L);

    ListInsert_Sq(L,1,s1);

    ListInsert_Sq(L,2,s2);

    printf("%d\t%d\t",*L.elem,L.elem[0-1]);



    l=LocateElem_Sq(L,*(L.elem+1),Compare_Sq);

    printf("%d\t",l);

    return 0;

}

 

你可能感兴趣的:(线性表)