//常量声明及定义
#include<malloc.h>
#include<stdlib.h>
#include<stdio.h>
#define LIST_TNIT_SIZE 100    //线性表初始空间大小。
#define LISTINCREMENT 10      //每次增加的空间大小。
#define ERROR 0
#define FALSE 0
#define TRUE 1
#define OK 1
//结构体声明
typedef struct
{
int *elem;//存储空间地址
int length;//当前长度
int listsize;//当前分配的存储容量
}List;
//''LIST.c"
/////////////////////////【操作函数】///////////////////////
int compare(int x1,int x2)
{
if(x1==x2)return(OK);                //如果x1等于x2,则返回值OK。
else  return(FALSE);            //否则返回值FALSE。
}
int visit(int *x)
{
*x=(*x)*(*x);                      //令x等于x的平方。
return(OK);
}
//线性表初始化,构造一个空的线性表L
int InitList (List *L)
{
L->elem=(int *)malloc((sizeof(int))*LIST_TNIT_SIZE);//分配一块新的内存空间,每个内存块大小为4个字节,初始默认100个内存块空间
if(!L->elem) return(ERROR);//内存分配空间失败,则退出函数,并返回值ERROR
else
{
L->length=0;//分配成功,则将初始长度置为0
L->listsize=LIST_TNIT_SIZE;//设定初始线性表的空间大小为100
return(OK);//空间分配成功,返回值OK
}
}
//销毁线性表L
int DestroyList(List *L)
{
free(L->elem);//释放线性表所占用的内存空间
L->elem=NULL;
L->length=0;
L->listsize=0;
return(OK);
}
//判断当前线性表是否为空,是空则返回TRUE,否则返回FALSE
int ListEmpty(List *L)
{
if(0==L->length)  return(TRUE);//若线性表长度为0,则为空。
else return(FALSE);//否则非空。
}
//返回线性表的长度
int ListLength(List *L)
{
return(L->length);
}
//返回线性表指定位置的值,并用e返回其值
int GetList(List *L,int i,int *e)
{
if(i<1||i>L->length)return(FALSE);//判断指定位置是否处于线性表的长度范围之内,没有则直接退出函数
*e=*(L->elem+i-1);//给e赋值
return(OK);
}
//得到指定值的位序并返回,不存在则返回FALSE
int LocateElem(List *L,int e)
{
int i;
for(i=0;i<L->length;i++)//从第一个元素开始寻与e存在制定关系的元素
if(compare(*(L->elem+i),e))break;
if(i<L->length)return(i+1);//存在则返回其位序
else return(FALSE);//若不存在则返回值FALSE
}
/
/查指定元素的前一个元素,并用pre_e返回其值
int PriorElem(List *L,int cur_e,int *pre_e)
int i,t=0;
if(cur_e==*(L->elem)||L->length==1) return(FALSE);  //若cur_e为第一个元素或者L只有一个元素,则返回值FALSE
for(i=1;i<L->length;i++)
{
if(*(L->elem+i)==cur_e)
{
*pre_e=*(L->elem+i-1);//若第i个元素等于cur_e,则返回第i-1个元素
t=1;
break;
}
}
if(t==1)return(OK);
else return(FALSE);
}
//查指定元素的后一个元素,并用next_e返回其值
int NextElem(List *L,int cur_e,int *next_e)
int i,t=0;
if(cur_e==*(L->elem+L->length-1)||L->length==1) return(FALSE);  //若cur_e为最后一个元素或者L只有一个元素,则返回值FALSE
for(i=0;i<L->length-1;i++)
{
if(*(L->elem+i)==cur_e)
{
*next_e=*(L->elem+i+1);//若第i个元素等于cur_e,则返回第i+1个元素
t=1;
break;
}
}
if(t==1)return(OK);
else return(FALSE);
}
//在指定位置插入一个元素e
int ListInsert(List *L,int i,int e)
{
int j;
int *newbase;
if(i<1||i>L->length+1)return(ERROR);                  //i值不合法
if(L->length>=L->listsize)
{
newbase=(int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));      //当前空间已满,增加分配
if(!newbase) exit(FALSE);      //存储分配失败
L->elem=newbase;                //新基址
L->listsize+=LISTINCREMENT;
}
for(j=L->length;j>i-1;j--)
{
*(L->elem+j)=*(L->elem+j-1);//插入元素,后面的元素后移
}
*(L->elem+j)=e;//插入元素e
++L->length;//长度增1
return(OK);
}
/
/删除指定位置的元素,并用e返回其值
int ListDelete(List *L,int i,int *e)
{
int j;
if(i<1||i>L->length)return(ERROR);        //i值不合法
*e=*(L->elem+i-1);//被删除元素的值赋给e                          /*    ****      表尾元素没处理      ****      */
for(j=i-1;j<L->length-1;j++)
{
*(L->elem+j)=*(L->elem+j+1);//被删除元素之后的元素前移
}
--L->length;//表长减1
return(OK);
}
//对线性表中的元素调用visit()函数
int ListTraverse(List *L)
{
int i;
for(i=0;i<L->length;i++)visit(L->elem+i);//从第一个元素开始调用visit()函数
if(visit(L->elem+i))return(OK);//调用成功则返回值OK
else return(FALSE);//否则返回值FALSE
}sizeof结构体大小
//////////////////////////////////【主函数】///////////////////////////////////
int main()
{
List L;
int e,f,j;
//初始化线性表,并显示其各属性
printf("初始化线性表,并显示其各属性:\n");
if(!InitList(&L))exit(ERROR);
printf("L.elem=%d,L.length=%d,L.listsize=%d\n",L.elem,L.length,L.listsize);
//向线性表中插入10个整形数
printf("输入10个整形数:\n");
for(j=0;j<10;j++)
{
scanf("%d",&e);
ListInsert(&L,j+1,e);
}
//显示插入几个数后的线性表各属性
printf("显示插入几个数后的线性表各属性:\n");
printf("L.elem=%d,L.length=%d,L.listsize=%d\n",L.elem,L.length,L.listsize);
printf("线性表的内容:\n");
for(j=0;j<ListLength(&L);j++)printf("%d,",*(L.elem+j));
putchar('\n');
//清空线性表,并显示清空后的各属性
printf("清空线性表,并显示清空后的各属性:\n");
DestroyList(&L);
printf("L.elem=%d,L.length=%d,L.listsize=%d\n",L.elem,L.length,L.listsize);
//判断线性表是否真的被清空
printf("判断线性表是否真的被清空:\n");
if(ListEmpty(&L))printf("线性表被清空\n");
else printf("线性表没有
被清空\n");
//从表尾插入指定数值
printf("输入10个整型数:\n");
for(j=0;j<10;j++)
{
scanf("%d",&e);
ListInsert(&L,L.length+1,e);
}
//显示插入新值后的线性表内容
printf("在L的表尾依次插入10个整形数据后:\n");
for(j=0;j<L.length;j++)printf("%d,",*(L.elem+j));
putchar('\n');
//显示插入新值后各线性表属性
printf("显示插入新值后各线性表属性:\n");
printf("L.elem=%d,L.length=%d,L.listsize=%d\n",L.elem,L.length,L.listsize);
/
/在线性表表头位置插入值0,并显示插入值0后的线性表内容
printf("在线性表表头位置插入值0,并显示插入值0后的线性表内容:\n");
ListInsert(&L,1,0);
for(j=0;j<L.length;j++)printf("%d,",*(L.elem+j));
putchar('\n');
//查看线性表中指定位置的元素值
printf("请输入要查看的元素位置:\n");
scanf("%d",&j);
if(GetList(&L,j,&e))printf("第%d个元素为:%d\n",j,e);
else printf("指定位置的元素不存在\n");
//查看当前线性表中是否存在指定数值相等的元素值
printf("请输入一个数,检验L中是否存在与该数相等的数:\n");
scanf("%d",&e);
if(LocateElem(&L,e))printf("第%d个元素与该数相等\n",LocateElem(&L,e));
else printf("没有与该数相等的元素\n");
//查看线性表中前3个元素的各自前驱
printf("查看线性表中前3个元素的各自前驱:\n");
for(j=0;j<3;j++)
{
GetList(&L,j+1,&f);
if(PriorElem(&L,f,&e))printf("第%d个元素的前驱为:%d\n",j+1,e);
else printf("第%d个元素无前驱\n",j+1);
}
//查看线性表中后3个元素的各自后继值
printf("查看线性表中后3个元素的各自后继值:\n");
for(j=L.length-3;j<L.length;j++)
{
GetList(&L,j+1,&f);
if(NextElem(&L,f,&e))printf("第%d个元素的后继值为:%d\n",j+1,e);
else printf("第%d个元素无后继值\n",j+1);
}
//删除指定位置的元素值
printf("请输入要删除的元素位置:\n");
scanf("%d",&j);
if(ListDelete(&L,j,&e))printf("第%d个元素的值为%d\n",j,e);
else printf("删除第%d个元素失败\n",j);
//对当前线性表中的元素值进行平方处理
ListTraverse(&L);
printf("当前L的元素增加为原来的平方后:\n");
for(j=0;j<L.length;j++)printf("%d,",*(L.elem+j));
putchar('\n');
//销毁当前的线性表
DestroyList(&L);
printf("销毁L后:\n");
printf("L.elem=%d,L.length=%d,L.listsize=%d\n",L.elem,L.length,L.listsize);
return(OK);
}