#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define FALSE_FP -1
#define TRUE 1
#define FALSE 0
#define ERROR 0;
#define OK 1;
#define LIST_INIT_SIZE 10
#define LIST_INCREATENT 2
typedef int ElemType;
typedef struct SqList
{
ElemType * elem;
int length;
int listsize;
}SqList;
void InitList(SqList &L)
{
if (!(L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType))))
exit(FALSE_FP);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
}
void DestoryList(SqList &L)
{
free(L.elem);
L.elem = NULL;
L.length = 0;
L.listsize = 0;
}
void ClearList(SqList &L)
{
L.length = 0;
}
int ListEmpty(SqList L)
{
if (L.length == 0)
return TRUE;
else
return FALSE;
}
int ListLength(SqList L)
{
return L.length;
}
int 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(*compare)(ElemType, ElemType))
{
int i = 1;
ElemType *p = L.elem;
while (i <= L.length&&!compare(*p++, e))
++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 = L.elem + 1;
while (i <= L.length&&*p != cur_e)
{
++p;
++i;
}
if (i > L.length)
{
return ERROR;
}
else
{
pre_e = *--p;
return OK;
}
}
int NextElem(SqList L, ElemType cur_e, ElemType &next_e)
{
int i = 1;
ElemType *p = L.elem;
while (i < L.length&&*p != cur_e)
{
++p;
++i;
}
if (i == L.length)
{
return ERROR;
}
else
{
next_e = *++p;
return OK;
}
}
int ListInsert(SqList &L, int i, ElemType e)
{
ElemType *newbase, *q, *p;
if (i<1 || i>L.length + 1)
return ERROR;
if (L.length == L.listsize)
{
newbase = (ElemType*)realloc(L.elem,(L.listsize+LIST_INCREATENT)*sizeof(ElemType));
if (!newbase)
exit(FALSE_FP);
L.elem = newbase;
L.listsize += LIST_INCREATENT;
}
q = L.elem + i - 1;
for (p = L.elem + L.length - 1; p >= q; --p)
*(p + 1) = *p;
*q = e;
++L.length;
return OK;
}
int 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 ListTraverse(SqList L, void(*visit)(ElemType &))
{
ElemType *p = L.elem;
int i;
for (i = 1; i <= L.length; ++i)
visit(*p++);
printf("\n");
}
int equal(ElemType c1, ElemType c2)
{
if (c1 == c2)
return true;
else
return false;
}
int comp(ElemType a, ElemType b)
{
if (a == b)
return 0;
else
return (a - b) / abs(a - b);
}
void print(ElemType c)
{
printf("%d ",c);
}
void print1(ElemType &c)
{
printf("%d ",c);
}
void print2(ElemType c)
{
printf("%c ", c);
}
int sq(ElemType c1, ElemType c2)
{ // 資料元素判定函式(平方關係),LocateElem()呼叫的函式
if (c1 == c2*c2)
return TRUE;
else
return FALSE;
}
void dbl(ElemType &c)
{ // ListTraverse()呼叫的另一函式(元素值加倍)
c *= 2;
}
void main()
{
SqList L;
ElemType e, e0;
int i;
int j, k;
InitList(L); // 初始化線性表L
printf("初始化L後,L.length=%d,L.listsize=%d,L.elem=%u\n", L.length,
L.listsize, L.elem);
for (j = 1; j <= 5; j++)
i = ListInsert(L, 1, j); // 在L的表頭插入j
printf("在L的表頭依次插入1~5後,*L.elem=");
for (j = 1; j <= 5; j++)
printf("%d ", *(L.elem + j - 1)); // 依次輸出表L中的元素
printf("\n呼叫ListTraverse()函式,依次輸出表L中的元素:");
ListTraverse(L, print1); // 依次對錶L中的元素呼叫print1()函式(輸出元素的值)
i = ListEmpty(L); // 檢測表L是否空
printf("L.length=%d(改變),L.listsize=%d(不變),", L.length, L.listsize);
printf("L.elem=%u(不變),L是否空?i=%d(1:是 0:否)\n", L.elem, i);
ClearList(L); // 清空表L
i = ListEmpty(L); // 再次檢測表L是否空
printf("清空L後,L.length=%d,L.listsize=%d,", L.length, L.listsize);
printf("L.elem=%u,L是否空?i=%d(1:是 0:否)\n", L.elem, i);
for (j = 1; j <= 10; j++)
ListInsert(L, j, j); // 在L的表尾插入j
printf("在L的表尾依次插入1~10後,L=");
ListTraverse(L, print1); // 依次輸出表L中的元素
printf("L.length=%d,L.listsize=%d,L.elem=%u\n", L.length, L.listsize, L.elem);
ListInsert(L, 1, 0); // 在L的表頭插入0,增加儲存空間
printf("在L的表頭插入0後,L.length=%d(改變),L.listsize=%d(改變),"
"L.elem=%u(有可能改變)\n", L.length, L.listsize, L.elem);
GetElem(L, 5, e); // 將表L中的第5個元素的值賦給e
printf("第5個元素的值為%d\n", e);
for (j = 10; j <= 11; j++)
{
k = LocateElem(L, j, equal); // 查詢表L中與j相等的元素,並將其位序賦給k
if (k) // k不為0,表明有符合條件的元素
printf("第%d個元素的值為%d,", k, j);
else // k為0,沒有符合條件的元素
printf("沒有值為%d的元素\n", j);
}
for (j = 3; j <= 4; j++) // 測試2個資料
{
k = LocateElem(L, j, sq); // 查詢表L中與j的平方相等的元素,並將其位序賦給k
if (k) // k不為0,表明有符合條件的元素
printf("第%d個元素的值為%d的平方,", k, j);
else // k為0,沒有符合條件的元素
printf("沒有值為%d的平方的元素\n", j);
}
for (j = 1; j <= 2; j++) // 測試頭2個資料
{
GetElem(L, j, e0); // 將表L中的第j個元素的值賦給e0
i = PriorElem(L, e0, e); // 求e0的前驅,如成功,將值賦給e
if (i == 0) // 操作失敗
{
printf("元素%d無前驅,", e0);
}
else // 操作成功
{
printf("元素%d的前驅為%d\n", e0, e);
}
}
for (j = ListLength(L) - 1; j <= ListLength(L); j++) // 最後2個資料
{
GetElem(L, j, e0); // 將表L中的第j個元素的值賦給e0
i = NextElem(L, e0, e); // 求e0的後繼,如成功,將值賦給e
if (i == 0)
{// 操作失敗
printf("元素%d無後繼\n", e0);
}
else // 操作成功
{
printf("元素%d的後繼為%d,", e0, e);
}
}
k = ListLength(L); // k為表長
for (j = k + 1; j >= k; j--)
{
i = ListDelete(L, j, e); // 刪除第j個資料
if(i==0)// 表中不存在第j個資料
printf("刪除第%d個元素失敗。", j);
else // 表中存在第j個資料,刪除成功,其值賦給e
printf("刪除第%d個元素成功,其值為%d", j, e);
}
ListTraverse(L, dbl); // 依次對元素呼叫dbl(),元素值乘2
printf("L的元素值加倍後,L=");
ListTraverse(L, print1); // 依次輸出表L中的元素
DestoryList(L);
printf("銷燬L後,L.length=%d,L.listsize=%d,L.elem=%u\n", L.length,
L.listsize, L.elem);
}