/*
下面有运行结果
你看看吧
*/
# include <stdio.h>
# include <stdlib.h>
//函数结果状态代码
# define OK 1
# define ERROR 0
typedef int Status;//Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int ElemType;
# define LIST_INIT_SIZE 10 //线性表存储空间的初始分配量
# define LIST_INCREMENT 4 //线性表存储空间的分配增量
struct SqList
{
ElemType * elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
};
//构造一个空的顺序线性表L
Status InitList(SqList * L)
{
(* L).elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!(* L).elem)
{
exit(-1);//存储分配失败
}
(* L).length = 0;//空表长度为0
(* L).listsize = LIST_INIT_SIZE;//初始存储容量
return OK;
}
//返回L中数据元素的个数
int ListLength(SqList L)
{
return L.length;
}
//用e返回L中的第i个元素的值,1=<i<=ListLength(L)
Status GetElem(SqList L, int i, ElemType * e)
{
if (i<1 || i>L.length)
{
return ERROR;
}
* e = *(L.elem + i - 1);
return OK;
}
//在L的第i个位置之前插入新的数据元素e,L的长度加1
Status ListInsert(SqList * L, int i, ElemType e)
{
ElemType * newbase, * q, * p;
if (i<1 || i>(* L).length+1)//i值不合法
{
return ERROR;
}
if ((* L).length >= (* L).listsize)//当前存储空间已满,增加分配
{
if (!(newbase = (ElemType *)realloc((*L).elem,((* L).listsize+LIST_INCREMENT)*sizeof(ElemType))))
{
exit(-1);//存储空间分配失败
}
(* L).elem = newbase;//新基址
(* L).listsize += LIST_INCREMENT;//增加存储容量
}
q = (* L).elem + i - 1;//q为插入位置
for (p=(* L).elem+(* L).length-1; p>=q; --p)//在插入位置的元素以及其后的元素后移
{
* (p+1) = * p;
}
* q = e;//插入e
++(* L).length;//表长增加1
return OK;
}
void print1(ElemType * c)
{
printf("%d ",* c);
}
//从表A中第一个元素开始,交替的用表A和B中的元素形成一个新表
//如果La的长度大于Lb的长度,则将La的剩余元素追加到新表的后面
//返回生成的新表
SqList Alternate(SqList La, SqList Lb)
{
SqList Lc;//交替生成的新表
InitList(&Lc);
ElemType e;
int La_len,Lb_len;
int i;
La_len = ListLength(La);//求线性表的长度
Lb_len = ListLength(Lb);
int length = La_len > Lb_len ? Lb_len : La_len;
for (i=1; i<=length; ++i)
{
GetElem(La,i,&e);//取出La中的第i个元素赋给e;
ListInsert(&Lc,ListLength(Lc)+1,e);//插入到Lc表的最后一个位置
GetElem(Lb,i,&e);//取出Lb中的第i个元素赋给e
ListInsert(&Lc,ListLength(Lc)+1,e);//插入到Lc表的最后一个位置
}
if (La_len > Lb_len)//将La的剩余元素插入到Lc表
{
for (i=Lb_len+1; i<=La_len; ++i)
{
GetElem(La,i,&e);
ListInsert(&Lc,ListLength(Lc)+1,e);
}
}
else if (La_len < Lb_len)//将La的剩余元素插入到Lc表
{
for (i=La_len+1; i<=Lb_len; ++i)
{
GetElem(Lb,i,&e);
ListInsert(&Lc,ListLength(Lc)+1,e);
}
}
return Lc;
}
Status ListTraverse(SqList L, void (* vi)(ElemType *))
{//依次对L的每个元素调用vi函数
ElemType * p;
int i;
p = L.elem;
for (i=1; i<=L.length; i++)
{
vi(p++);
}
printf("\n");
return OK;
}
int main(void)
{
SqList La,Lb;
int j;
InitList(&La);//创建空表La
for (j=1; j<=5; ++j)
{
ListInsert(&La,j,j);//在表尾依次插入1-5
}
printf("La=");//输出La的内容
ListTraverse(La,print1);
InitList(&Lb);//创建空表Lb
for (j=1; j<=10; ++j)
{
ListInsert(&Lb,j,2*j);//在表尾依次插入2,4,6,8,10
}
printf("Lb=");//输出Lb
ListTraverse(Lb,print1);
SqList Lc = Alternate(La,Lb);
printf("从表La中第一个元素开始,交替的用表La和Lb中的元素形成一个新表Lc=\n");
ListTraverse(Lc,print1);
return 0;
}
/*
在vc++6.0中的输出结果:
------------------------
La=1 2 3 4 5
Lb=2 4 6 8 10 12 14 16 18 20
从表La中第一个元素开始,交替的用表La和Lb中的元素形成一个新表Lc=
1 2 2 4 3 6 4 8 5 10 12 14 16 18 20
Press any key to continue
------------------------------:
*/
温馨提示:内容为网友见解,仅供参考