#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#ifndef LELEMTYPE_SQ
#define LELEMTYPE_SQ
typedef int LElemType_Sq;
#endif
typedef struct
{
LElemType_Sq *elem;
int length;
int listsize;
}SqList;
线性表基本操作
Status InitList_Sq(SqList *L)
{
(*L).elem = (LElemType_Sq*)malloc(LIST_INIT_SIZE*sizeof(LElemType_Sq));
if(!(*L).elem)
exit(OVERFLOW);
(*L).length = 0;
(*L).listsize = LIST_INIT_SIZE;
return OK;
}
void ClearList_Sq(SqList *L)
{
(*L).length = 0;
}
void DestroyList_Sq(SqList *L)
{
free((*L).elem);
(*L).elem = NULL;
(*L).length = 0;
(*L).listsize = 0;
}
Status ListEmpty_Sq(SqList L)
{
return L.length==0 ? TRUE : FALSE;
}
int ListLength_Sq(SqList L)
{
return L.length;
}
Status GetElem_Sq(SqList L, int i, LElemType_Sq *e)
{
if(i<1 || i>L.length)
return ERROR;
else
*e = L.elem[i-1];
return OK;
}
int LocateElem_Sq(SqList L, LElemType_Sq e, Status(Compare)(LElemType_Sq, LElemType_Sq))
{
int i = 1;
while(i<=L.length && !Compare(e, L.elem[i-1]))
++i;
if(i<=L.length)
return i;
else
return 0;
}
Status PriorElem_Sq(SqList L, LElemType_Sq cur_e, LElemType_Sq *pre_e)
{
int i = 1;
if(L.elem[0]!=cur_e)
{
while(i<L.length && L.elem[i]!=cur_e)
++i;
if(i<L.length)
{
*pre_e = L.elem[i-1];
return OK;
}
}
return ERROR;
}
Status NextElem_Sq(SqList L, LElemType_Sq cur_e, LElemType_Sq *next_e)
{
int i = 0;
while(i<L.length && L.elem[i]!=cur_e)
++i;
if(i<L.length-1)
{
*next_e = L.elem[i+1];
return OK;
}
return ERROR;
}
Status ListInsert_Sq(SqList *L, int i, LElemType_Sq e)
{
LElemType_Sq *newbase;
LElemType_Sq *p, *q;
if(i<1 || i>(*L).length+1)
return ERROR;
if((*L).length >= (*L).listsize)
{
newbase = (LElemType_Sq*)realloc((*L).elem, ((*L).listsize+LISTINCREMENT)*sizeof(LElemType_Sq));
if(!newbase)
exit(OVERFLOW);
(*L).elem = newbase;
(*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_Sq(SqList *L, int i, LElemType_Sq *e)
{
LElemType_Sq *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;
}
Status ListTraverse_Sq(SqList L, void(Visit)(LElemType_Sq))
{
int i;
for(i=0; i<L.length; i++)
Visit(L.elem[i]);
return OK;
}
Status CmpGreater(LElemType_Sq e, LElemType_Sq data);
void PrintElem(LElemType_Sq e);
int main(int argc, char **argv)
{
SqList L;
int i;
LElemType_Sq e;
printf("▼1\n▲函数 InitList_Sq 测试...\n");
{
printf("初始化顺序表 L ...\n");
InitList_Sq(&L);
printf("\n");
}
PressEnter;
printf("▼4\n▲函数 ListEmpty_Sq 测试...\n");
{
ListEmpty_Sq(L) ? printf(" L 为空!!\n") : printf(" L 不为空!\n");
printf("\n");
}
PressEnter;
printf("▼10\n▲函数 ListInsert_Sq 测试...\n");
{
for(i=1; i<=6; i++)
{
printf("作为示范,在 L 第 %d 个位置插入 \"%d\"...\n", i, 2*i);
ListInsert_Sq(&L, i, 2*i);
}
printf("\n");
}
PressEnter;
printf("▼12\n▲函数 ListTraverse_Sq 测试...\n");
{
printf(" L 中的元素为:L = ");
ListTraverse_Sq(L, PrintElem);
printf("\n\n");
}
PressEnter;
printf("▼5\n▲函数 ListLength_Sq 测试...\n");
{
i = ListLength_Sq(L);
printf(" L 的长度为 %d \n", i);
printf("\n");
}
PressEnter;
printf("▼11\n▲函数 ListDelete_Sq 测试...\n");
{
ListDelete_Sq(&L, 6, &e);
printf("删除 L 中第 6 个元素 \"%d\" ...\n", e);
printf(" L 中的元素为:L = ");
ListTraverse_Sq(L, PrintElem);
printf("\n\n");
}
PressEnter;
printf("▼6\n▲函数 GetElem_Sq 测试...\n");
{
GetElem_Sq(L, 4, &e);
printf(" L 中第 4 个位置的元素为 \"%d\" \n", e);
printf("\n");
}
PressEnter;
printf("▼7\n▲函数 LocateElem_Sq 测试...\n");
{
i = LocateElem_Sq(L, 7, CmpGreater);
printf(" L 中第一个元素值大于 \"7\" 的元素的位置为 %d \n", i);
printf("\n");
}
PressEnter;
printf("▼8\n▲函数 PriorElem_Sq 测试...\n");
{
PriorElem_Sq(L, 6, &e);
printf("元素 \"6\" 的前驱为 \"%d\" \n", e);
printf("\n");
}
PressEnter;
printf("▼9\n▲函数 NextElem_Sq 测试...\n");
{
NextElem_Sq(L, 6, &e);
printf("元素 \"6\" 的后继为 \"%d\" \n", e);
printf("\n");
}
PressEnter;
printf("▼2\n▲函数 ClearList_Sq 测试...\n");
{
printf("清空 L 前:");
ListEmpty_Sq(L) ? printf(" L 为空!!\n") : printf(" L 不为空!\n");
ClearList_Sq(&L);
printf("清空 L 后:");
ListEmpty_Sq(L) ? printf(" L 为空!!\n") : printf(" L 不为空!\n");
printf("\n");
}
PressEnter;
printf("▼3\n▲函数 DestroyList_Sq 测试...\n");
{
printf("销毁 L 前:");
L.elem ? printf(" L 存在!\n") : printf(" L 不存在!!\n");
DestroyList_Sq(&L);
printf("销毁 L 后:");
L.elem ? printf(" L 存在!\n") : printf(" L 不存在!!\n");
printf("\n");
}
PressEnter;
return 0;
}
Status CmpGreater(LElemType_Sq e, LElemType_Sq data)
{
return data>e ? TRUE : FALSE;
}
void PrintElem(LElemType_Sq e)
{
printf("%d ", e);
}
线性表并集∪
void Union(SqList *La, SqList Lb)
{
int La_len, Lb_len;
int i;
LElemType_Sq e;
La_len = ListLength_Sq(*La);
Lb_len = ListLength_Sq(Lb);
for(i=1; i<=Lb_len; i++)
{
GetElem_Sq(Lb, i, &e);
if(!LocateElem_Sq(*La, e, equal))
ListInsert_Sq(La, ++La_len, e);
}
}
Status equal(LElemType_Sq e1, LElemType_Sq e2)
{
return e1==e2 ? TRUE : FALSE;
}
void PrintElem(LElemType_Sq e);
int main(int argc, char **argv)
{
SqList La, Lb;
LElemType_Sq a[5] = {5, 2, 1, 3, 9};
LElemType_Sq b[7] = {7, 2, 6, 9, 11, 3, 10};
int i;
InitList_Sq(&La);
for(i=1; i<=5; i++)
ListInsert_Sq(&La, i, a[i-1]);
InitList_Sq(&Lb);
for(i=1; i<=7; i++)
ListInsert_Sq(&Lb, i, b[i-1]);
printf("La = ");
ListTraverse_Sq(La, PrintElem);
printf("\n");
printf("Lb = ");
ListTraverse_Sq(Lb, PrintElem);
printf("\n\n");
printf("La = La∪Lb = ");
Union(&La, Lb);
ListTraverse_Sq(La, PrintElem);
printf("\n\n");
return 0;
}
void PrintElem(LElemType_Sq e)
{
printf("%d ", e);
}
线性表合并
void MergeSqList_1(SqList La, SqList Lb, SqList *Lc)
{
int La_len, Lb_len;
int i, j, k;
LElemType_Sq ai, bj;
i = j = 1;
k = 0;
InitList_Sq(Lc);
La_len = ListLength_Sq(La);
Lb_len = ListLength_Sq(Lb);
while(i<=La_len && j<=Lb_len)
{
GetElem_Sq(La, i, &ai);
GetElem_Sq(Lb, j, &bj);
if(ai<=bj)
{
ListInsert_Sq(Lc, ++k, ai);
i++;
}
else
{
ListInsert_Sq(Lc, ++k, bj);
j++;
}
}
while(i<=La_len)
{
GetElem_Sq(La, i++, &ai);
ListInsert_Sq(Lc, ++k, ai);
}
while(j<=Lb_len)
{
GetElem_Sq(Lb, j++, &bj);
ListInsert_Sq(Lc, ++k, bj);
}
}
void MergeSqList_2(SqList La, SqList Lb, SqList *Lc)
{
LElemType_Sq *pa, *pb, *pc;
LElemType_Sq *pa_last, *pb_last;
pa = La.elem;
pb = Lb.elem;
(*Lc).listsize = (*Lc).length = La.length + Lb.length;
pc = (*Lc).elem = (LElemType_Sq *)malloc((*Lc).listsize*sizeof(LElemType_Sq));
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++;
while(pb <= pb_last)
*pc++ = *pb++;
}
void PrintElem(LElemType_Sq e);
int main(int argc, char **argv)
{
SqList La, Lb, Lc1, Lc2;
LElemType_Sq a[4] = {3, 5, 8, 11};
LElemType_Sq b[7] = {2, 6, 8, 9, 11, 15, 20};
int i;
InitList_Sq(&La);
for(i=1; i<=4; i++)
ListInsert_Sq(&La, i, a[i-1]);
InitList_Sq(&Lb);
for(i=1; i<=7; i++)
ListInsert_Sq(&Lb, i, b[i-1]);
printf("La = ");
ListTraverse_Sq(La, PrintElem);
printf("\n");
printf("Lb = ");
ListTraverse_Sq(Lb, PrintElem);
printf("\n\n");
MergeSqList_1(La, Lb, &Lc1);
printf("合并La和Lb为Lc1 = ");
ListTraverse_Sq(Lc1, PrintElem);
printf("\n\n");
MergeSqList_2(La, Lb, &Lc2);
printf("合并La和Lb为Lc2 = ");
ListTraverse_Sq(Lc2, PrintElem);
printf("\n\n");
return 0;
}
void PrintElem(LElemType_Sq e)
{
printf("%d ", e);
}