#include "stdio.h"
#include "stdlib.h" //用到了srand函数,所以要有这个头文件
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
//因为要初始化,要对线性表本身进行操作,所以不能用值传递。值传递不会改变实参的值嘛。
//地址传递的话呢,实际上在函数内部执行了这么一个操作:L = &L. 所以操作函数内部的L,
//也就相当于操作外部的线性表L。其实地址传递也是值传递。不过这个值是地址而已。
//也就是说,需要修改表的就传指针,不需要修改表的传值就行了。
Status InitList(SqList *L) //初始化线性表
{
L->length=0;
return OK;
}
SqList Create(SqList L) //顺序表的建立
{
int i;
srand((unsigned)time(NULL));
for(i=0; i < 10; i++)
{
L.data[i] = rand ( ) % 100; //产生0-100随机数
L.length++;
}
return L;
}
Status ClearList(SqList *L) //清除线性表
{
L->length = 0;
return OK;
}
Status visit(ElemType c) //访问线性表
{
printf("%d ",c);
return OK;
}
Status ListTraverse(SqList L) //遍历线性表
{
int i;
for(i=0;i < L.length;i++)
visit(L.data[i]); //访问线性表
printf("n");
return OK;
}
Status ListInsert(SqList *L,int i,ElemType e) //线性表插入
{ //结构体指针 插入位置 ElemType=int插入的值
int k;
if (L->length==MAXSIZE)
return ERROR;
if (i < 1 || i>L->length+1)
return ERROR;
if (i <= L->length) //i带入插入位置
{
for(k=L->length-1;k>=i-1;k--) //遍历
L->data[k+1]=L->data[k]; //往后移位
}
L->data[i-1]=e; //e带入插入的值
L->length++; //线性表长度加1
return OK;
}
Status ListDelete(SqList *L,int i,ElemType *e) //删除某个元素
{ //结构体指针 删除位置
int k;
if (L->length==0)
return ERROR;
if (i < 1 || i>L->length)
return ERROR;
*e=L->data[i-1]; //i删除位置(变量就是“.”指针就是“->”)
if (i < L->length)
{
for(k=i; k < L->length; k++)
L->data[k-1]=L->data[k];
}
L->length--;//线性表长度减1
return OK;
}
//首先参数,我们需要传入线性表L,仅仅查找的话是不需要对表进行变化的,所以用值传递就行。
//然后就是传入需要查找元素的位置 i,最后还需要一个参数 *e,这个需要用地址传递,
//因为要保存函数的查找结构。
Status GetElem(SqList L,int i,ElemType *e) //查找表中元素
{
if(L.length==0 || i < 1 || i>L.length)
return ERROR;
*e=L.data[i-1];
return OK;
}
int ListLength(SqList L) //线性表长度
{
return L.length;
}
Status ListEmpty(SqList L) //线性表是否为空
{
return (L.length == 0)? TRUE : FALSE;
}
int LocateElem(SqList L,ElemType e) //判断元素是否在表中
{
int i;
if (L.length==0)
return 0;
for(i=0;i < L.length;i++)
{
if (L.data[i]==e)
break;
}
if(i>=L.length)
return 0;
return i+1;
}
int main(void)
{
SqList L; ElemType e; Status i; int opp;
int j,k;
int pos;
ElemType value;
i=InitList(&L);//初始化线性表
printf("初始化成功,L.length=%dn",L.length);
printf("n1.遍历线性表 n2.线性表赋值 n3.清空线性表 n4.线性表插入 n5.查找表中元素 n6.判断元素
是否在表中 n7.删除某个元素 n8.线性表长度n9.线性表是否为空n0.退出 n请选择你的操作:n");
while(opp != 0)
{
scanf("%d",&opp);
switch(opp)
{
case 1:
ListTraverse(L); //遍历线性表
printf("n");
break;
case 2:
L = Create(L);
printf("创建随机链表:L.data="); //线性表赋值
ListTraverse(L); //遍历线性表
printf("n");
break;
case 3:
i=ClearList(&L);
printf("清空L后:L.length=%dn",L.length); //清空线性表
ListTraverse(L); //遍历线性表
printf("n");
break;
case 4:
printf("请输入插入元素位置:"); //线性表插入
scanf("%d",&pos);
printf("请输入插入元素的值:");
scanf("%d",&value);
i = ListInsert(&L,pos,value); //线性表插入
printf("插入完毕,现在线性表为:n");
ListTraverse(L); //遍历线性表
printf("n");
break;
case 5:
printf("你要查找第几个元素? "); //查找表中元素
scanf("%d",&pos);
GetElem(L,pos,&e); //查找表中元素
printf("第%d个元素的值为:%dn",pos,e);
break;
case 6:
printf("输入你想知道是否在表中的数值: "); //判断元素是否在表中
scanf("%d",&e);
k=LocateElem(L,e); //判断元素是否在表中
// 这里假定随机数组中的元素互不重复
if(k)
printf("值为%d是表中的第%d个元素n",e,k);
else
printf("没有值为%d的元素n",e);
break;
case 7:
printf("要删除第几个元素?"); //删除某个元素
scanf("%d",&pos);
ListDelete(&L,pos,&e); //删除某个元素(实验时&e可以去掉)
printf("删除完毕,现在线性表为:n");
ListTraverse(L); //遍历线性表
printf("n");
break;
case 8:
k = ListLength(L); //线性表长度
printf("线性表的长度为: %d n", k);
break;
case 9:
i = ListEmpty(L); //线性表是否为空
if (i)
printf("该线性表为空.n");
else
printf("该线性表非空n");
break;
case 0:
exit(0); //退出
}
}
}
----------------------------------------------------------------------------------------------------------------
附录
1、参考:第01话:线性表的概念与定义 -- 简明现代魔法
----------------------------------------------------------------------------------------------------------------



