您的位置:首页 > 其它

线性表的顺序实现

2006-02-14 09:31 344 查看
线性表的顺序表示和实现
时间:2006/02/14
测试环境:TC2.0

#include "stdio.h"
#define TRUE 1
#define FALSE 0
#define List_Init_Size 30
#define List_Increment 10
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}Sqlist;

/*初始化一个线性表*/
int InitList_Sq(Sqlist *L)
{
L->elem=(ElemType *)malloc(List_Init_Size*sizeof(ElemType));
if(!L->elem)
return TRUE;
L->length=0;
L->listsize=List_Init_Size;
return FALSE;
}

/*销毁一个线性表*/
void DestroyList(Sqlist *L)
{
if(L->elem)
{
free(L->elem);
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 FALSE;
*e=L.elem[i-1];
}

/*比较两个元素*/
int compare(ElemType x,ElemType y)
{
if(x==y)
return TRUE;
else
return FALSE;
}

/*返回线性表中第一个与e满足关系compare()的元素的位序*/
int LocateElem(Sqlist L,ElemType e)
{
int i;
for(i=0;i<L.length;i++)
{
if(compare(L.elem[i],e))
return i+1;
}
return FALSE;
}

/*若cur_e是线性表的元素,且不是第一个,则返回它的前驱*/
int PriorElem(Sqlist L,ElemType cur_e,ElemType *e)
{
int i;
if(cur_e==L.elem[0])
return FALSE;
for(i=1;i<L.length;i++)
{
if(L.elem[i]==cur_e)
*e=L.elem[i-1];
}
}

/*若cur_e是线性表的元素,且不是最后一个,则返回它的后继*/
int NextElem(Sqlist L,ElemType cur_e,ElemType *e)
{
int i;
if(cur_e==L.elem[L.length-1])
return FALSE;
for(i=0;i<L.length-1;i++)
{
if(L.elem[i]==cur_e)
*e=L.elem[i+1];
}
}

/*在线性表的第i个位置前插入新元素e*/
int ListInsert(Sqlist *L,int i,ElemType e)
{
ElemType *p,*q,*newbase;
if(i<1 || i>(L->length+1))
return FALSE;
if((L->length) >= (L->listsize))
{
newbase=(ElemType *)realloc(L->elem,
(List_Init_Size+List_Increment)*sizeof(ElemType));
if(!newbase)
return FALSE;
L->elem = newbase;
L->listsize+=List_Increment;
}
p=&(L->elem[i-1]);
for(q=&(L->elem[L->length-1]);q>=p;--q)
*(q+1)=*q;
*p=e;
++(L->length);
}

/*删除线性表的第i个元素,并用e返回其值*/
int ListDelete(Sqlist *L,int i,ElemType *e)
{
ElemType *p,*q;
if(i<1 || i>(L->length))
return FALSE;
p=&(L->elem[i-1]);
*e=*p;
q=L->elem+L->length-1;
for(++p;p<=q;p++)
*(p-1)=*p;
--(L->length);
}

/*两个线性表的合并*/
void MergeList(Sqlist La,Sqlist Lb,Sqlist *Lc)
{
int La_len,Lb_len;
int i,j,k;
ElemType ai,bj;
i=j=1;
k=0;
InitList_Sq(Lc);
La_len=ListLength(La);
Lb_len=ListLength(Lb);
while(i<=La_len && j<=Lb_len)
{
GetElem(La,i,&ai);
GetElem(Lb,j,&bj);
if(ai<=bj)
{
ListInsert(Lc,++k,ai);
++i;
}
else
{
ListInsert(Lc,++k,bj);
++j;
}
}
while(i<=La_len)
{
GetElem(La,i++,&ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len)
{
GetElem(Lb,j++,&bj);
ListInsert(Lc,++k,bj);
}
}

void main()
{
Sqlist L1,L2,L3;
ElemType e;
/*初始化一个线性表*/
InitList_Sq(&L1);
InitList_Sq(&L2);

/*L1插入元素*/
ListInsert(&L1,1,44);
ListInsert(&L1,2,66);
ListInsert(&L1,3,88);
ListInsert(&L1,4,100);
ListInsert(&L1,5,120);
/*L2插入元素*/
ListInsert(&L2,1,33);
ListInsert(&L2,2,55);
ListInsert(&L2,3,77);
ListInsert(&L2,4,99);
/*打印出L1和L2的值*/
printf("******/tL1 is:");
for(e=0;e<L1.length;e++)
printf("/t%d",L1.elem[e]);

printf("/n******/tL2 is:");
for(e=0;e<L2.length;e++)
printf("/t%d",L2.elem[e]);

/*返回元素个数*/
printf("/n******/tL1 have %d numbers",ListLength(L1));

/*判断线性表是否为空*/
printf("/n******/tL1 is Empty? %d",ListEmpty(L1));

/*返回第i个元素的值*/
GetElem(L1,3,&e);
printf("/n******/tthe third number of L1 is:%d",e);

/*返回线性表中第一个与e满足关系compare()的元素的位序*/
printf("/n******/tcompare with number 88 is %dth number of L1./n",LocateElem(L1,88));

/*若cur_e是线性表的元素,且不是第一个,则返回它的前驱*/
PriorElem(L1,88,&e);
printf("******/tthe prior number of 88 is:");
printf("%d/n",e);

/*若cur_e是线性表的元素,且不是最后一个,则返回它的后继*/
NextElem(L1,88,&e);
printf("******/tthe next number of 88 is:");
printf("%d/n",e);

/*在线性表的第i个位置前插入新元素e*/
ListInsert(&L1,3,70);
GetElem(L1,3,&e);
printf("******/tInsert:%d/n",e);
printf("Now,L1 is:");
for(e=0;e<L1.length;e++)
printf("/t%d",L1.elem[e]);

/*删除线性表的第i个元素,并用e返回其值*/
ListDelete(&L1,4,&e);
printf("/n******/tDelete:%d/n",e);
printf("Now,L1 is:");
for(e=0;e<L1.length;e++)
printf("/t%d",L1.elem[e]);
printf("/n");

/*合并两个线性表L1,L2*/
MergeList(L1,L2,&L3);
printf("******/tL1 merges L2 is:/n");
for(e=0;e<L3.length;e++)
printf("/t%d",L3.elem[e]);

/*清空线性表*/
ClearList(&L1);
printf("/n******/tClear the L1,L1 is Empty now? %d",ListEmpty(L1));

/*销毁线性表*/
DestroyList(&L1);
printf("/n******/tDestroy the L1,");
printf("now,L1's listsize=%d",L1.listsize);

getch();
}


运行后结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: