#define LISTSIZE 100 //用宏定义定义线性表的最多能保存元素的个数
typedef int DataType //typedef的作用是为int类型起别名为DataType
typedef struct SeqList //为结构体类型起别名为SeqList
{
DataType data[LISTSIZE]; //使用数组作为线性表
int nLength; //线性表的长度
} SeqList;
//① 初始化
void intList(SeqList *list) //形参用结构体指针,使传过来的地址指向结构体首部
{
list->nLength = 0; //使&sl->list->nLength = 0;使线性表长度为0
}
//② 判断线性表是否为空
bool listEmpty(SeqList *list)
{
return list->nLength == 0; //判断
}
//③ 删除线性表中的所有元素
void clearList(SeqList *list) //形参用结构体指针,使传过来的地址指向结构体首部
{
list->nLength = 0; //使&sl->list->nLength = 0;使线性表长度为0
}
//④ 获取线性表L中元素的个数
int listLength(SeqList *list)
{
return list->nLength;
}
//⑤ 获取线性表中下标为i的元素
DataType* getNode(SeqList *list, int i) //DataType*(int*)类型指针函数
{
if ( i<0||i>list->nLength-1 )
return NULL;
return &list->data[i]; //放回data[i]的地址
}
//⑥ 在线性表中查找指定的元素(定位)
int locateNode(SeqList *list,DataType x)
{
int =i;
int =j;
for (i=0;i<list->nLength;i++) //需要循环5次应为,因为线性表长度为5,而list->nLength表示的是nLength 的值
{
if(list->data[i] == x)
return i;
}
return -1; //x的值不存在则返回-1
}
//⑦ 为线性表中下标为i的位置插入元素
bool insert(SeqList *list,int i,DataType x) //布尔型函数
{
if(list->nLength == LISTSIZE) //如果线性表的长度已经满了,那么就不能在存了
return false;
int insertPosition = i; //定义插入变量把i的值赋予给它
if (i < 0) //在线性表范围外则结构体外
insertPosition = 0;
if(i>list->nLength-1) //在线性表范围外则结构内,线性表外(nLengtht-1:最后一个元素的下标)
insertPosition = list->nLength;
for(j=list->nLength-1;j>=insertPosition;j--) //线性表总长度为4即nLength-1
{
list->data[j+1]=list->data[j]; //元素往后移动一位(从倒数第一个开始挪)
}
list->data[insertPosition] = x; //在确定的位置插入元素值
list->nLength++; //线性表长度增加1
return true;
}
//⑧ 将线性表中下标为i的元素删除
bool DeleteList(SeqList *list,int i)
{
int j;
if (i<0 || i>=nLength) //不在线性表内或线性表已经满了
return false;
for(int j=i;list->nLength-1;j++)
{
list->data[i]=list->data[i+1]; //元素往前移动一位(从第一个开始挪)
}
list->nLength--
return ture;
}
// 线性表的实际应用
//① 合并线性表,也就是有a,b2个表,用数学的合并:U,
//{1,5,6}U{1,5,7}={1,5,6,7}
//实际是把b的表合并到a中
viod union(SeqList *a,SeqList *b)
{
if(a->nLength + b->nLength >LISTSIZE)
return 0;
int i;
for (i=0;i<b->nLength;i++)
{
DataType e =b->data[i];
if(locateNode(a,e)==-1) //若e的值(即data[i])的值不存在则返回-1
{
insert(a,a->nLength,e); //把e的值赋给a线性表的最后一个位置处
}
}
}
//② 线性表倒置
void reverse(SeqList *list)
{
int i;
for(i=0;i<list->nLength/2;i++)
{
DataType t = list->data[i];
list-data[i]=list->data[list->nLength-1-i];
list->data[list->nLength-1-i] = t;
}
}
//③ 遍历线性表
viod print(DataType d){
printf("%d\n",d);
}
viod trave(SeqList *list,void(*visitFun)(DataType)) //void(*visitFun)(DataType)为函数指针
{
int i;
for (i=0;i<list->nLength;i++)
{
visitFun(list->data[i]);
}
}
void main()
{
SeqList sl;
intList(&sl); //初始化后nLength为0
bool tmpty = listEmpty(&sl); //定义一个布尔变量
//假如已经为线性表赋予了5个元素,即长度为0
DataType *pNode = getNode($sl,3); //向sl指向的线性表(结构体:线性表+线性表长度)中取出第4(下标为3)个元素的地址赋值给*pNode
printf("%d",*pNode);
int index = locateNode(&sl,6); //查找线性表中6所在的位置
printf("%d",index+i);
insert(&sl,5,10); //在下标为5的位置插入一个数值10
trave(&sl.print);
}