线性表的顺序表示与实现

来源:互联网 发布:js防水涂料价格 编辑:程序博客网 时间:2024/05/18 02:51
#include<stdlib.h>
#include<stdio.h>
#include<iostream>


#define TRUE         1
#define FALSE        0
#define OK           1
#define ERROR        0
#define INFEASIBLE  -1
#define OVERFLOW    -2


typedef int status;
typedef int ElemType;


#define LIST_INIT_SIZE    100
#define LISTINCREMENT     10


typedef struct{
ElemType  *elem;
int       length;
int       listsize;
}SqList;                                     //顺序表


status InitList(SqList &L)
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;


return OK;
}


status DestoryList(SqList &L)
{
free(&L);


return OK;
}


status ClearList(SqList &L)
{
L.length=0;


return OK;
}


status ListEmpty(SqList L)
{
if(L.length==0)
return TRUE;
else
return FALSE;
}


status ListLength(SqList L)
{
return L.length;
}


status GetElem(SqList L, int i, ElemType &e)
{
if(i>0 && i<L.length+1)
{
e=L.elem[i-1];
return OK;
}
else
return FALSE;
}


status compare(ElemType a, ElemType b)
{
if(a==b)
return OK;
else
return FALSE;
}


status LocateElem(SqList L, ElemType e, status(*compare)(ElemType, ElemType))
{
int i=1;
while(i<=L.length && !(*compare)(L.elem[i],e))
i++;
if(i<=L.length)
return i;
else
return FALSE;
}


status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e)
{
int i=1;
while(i <= L.length  && !(cur_e==L.elem[i-1]))
i++; 
if(i<2||i>L.length)
return ERROR;
pre_e=L.elem[i-2];
return OK;
}


status NextElem(SqList L, ElemType cur_e, ElemType &next_e)
{
int i=1;
while(i <= L.length  && !(cur_e==L.elem[i-1]))
i++; 
if(i<2||i>L.length)
return ERROR;
next_e=L.elem[i];
return OK;
}


status ListInsert(SqList &L, int i, ElemType e)
{
if(i<1 || i>L.length+1)
return ERROR;
if(L.length>=L.listsize)
{
ElemType* newbase=(ElemType*)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
ElemType* q=&(L.elem[i-1]);                              //q为插入位置
for(ElemType* 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)
{
if(i<1 || i>L.length+1)
return ERROR;
e=L.elem[i-1];
for(ElemType* p=&(L.elem[i-1]);i<=L.length;++p,++i)
*p = *(p+1);
--L.length;
return OK;
}


void MergeList(SqList La, SqList Lb, SqList &Lc)

{

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

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

ElemType* pa=La.elem;
ElemType* pb=Lb.elem;
Lc.listsize=Lc.length=La.length+Lb.length;
ElemType* pc=(ElemType*)malloc(sizeof(ElemType)*Lc.listsize);
if(!Lc.elem)
exit(OVERFLOW);
ElemType* pa_last=pa+La.length-1;
ElemType* pb_last=pb+Lb.length-1;
while(pa<=pa_last&&pb<pb_last)
{
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last)
*pc++=*pa++;
while(pb<=pb_last)
*pc++=*pb++;
}


int main()
{
SqList List;
InitList(List);
for(int i=0;i<10;i++)
ListInsert(List,i,i);
int t;
ListDelete(List,3,t);
printf("%d\t",t);


int a;
NextElem(List, 7, a);
printf("%d\t",a);


return 0;
}
0 0