一.状态值
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
二.线性表定义
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef int status;
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;
}
void DestroyList(Sqlist &L)
{
if (L.elem) free(L.elem);
L.elem = NULL;
}
void ClearList(Sqlist &L)
{
L.length = 0;
}
Status ListEmpty(Sqlist L)
{
if (L.length == 0) return TURE;
else return FALSE;
}
int ListLength(Sqlist L)
{
return L.length;
}
Status GetElem(Sqlist L, int i, ElemType &e) {
if (i<1 || i>L.length) return ERROR;
e = L.elem[i - 1];
return OK;
}
int LocateElem(Sqlist L, ElemType e)
{
int i = 1;
while (i <= L.length && L.elem[i - 1] != e) i++;
if (i <= L.length) return i;
else return 0;
}
Status PriorElem(Sqlist L, ElemType cur_e, ElemType *pre_e)
{
int i;
i = LocateElem(L, cur_e);
if ((i == 0) || (i == 1))
{
*pre_e = 'no';
printf("%d无直接前驱元素\n", cur_e);
return ERROR;
}
else
{
*pre_e = L.elem[i - 2];
printf("%d的直接前驱元素是 %d\n", cur_e, *pre_e);
return OK;
}
}
Status NextElem(Sqlist L, ElemType cur_e, ElemType *next_e)
{
int i;
i = LocateElem(L, cur_e);
if ((i == 0) || (i == L.length))
{
*next_e = 'no';
printf("%d无直接后继元素\n", cur_e);
return ERROR;
}
else
{
*next_e = L.elem[i];
printf("%d的直接后继元素是 %d\n", cur_e, *next_e);
return OK;
}
}
Status ListInsert(Sqlist &L, int i, ElemType e)
{
ElemType *p, *q;
if (i<1 || i>L.length + 1) return ERROR;
if (L.length == L.listsize)
{
L.elem = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
if (!L.elem) exit(OVERFLOW);
L.listsize += LISTINCREMENT;
}
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)
{
ElemType *p, *q;
if (i<1 || i>L.length) return ERROR;
p = &L.elem[i - 1];
e = *p;
q = L.elem + L.length - 1;
for (++p; p <= q; ++p)
*(p - 1) = *p;
--L.length;
return OK;
}
void Print_Sq(Sqlist L)
{
int i;
for (i = 0; i < L.length; i++)
printf("%d\t", L.elem[i]);
}
Status CompareList(Sqlist L, ElemType e1, ElemType e2)
{
if (e1 > e2 || e1 == e2)
return TURE;
else return FALSE;
}