#include <stdio.h>//必要的库文件包括
#include <malloc.h>
#define MaxSize 50 //必要的宏定义
//声明实现算法的自定义函数,以及其他必要的自定义函数
typedef int ElemType;//将ElemType定义为int类型
typedef struct//用来存储顺序表的结构体Sq
{
ElemType data[MaxSize];//定义一个数组用来存储,int型
int length;//顺序表的长度
}SqList;
bool ListEmpty(SqList *L);//———————————————判断线性表是否为空ListEmpty
void DispList(SqList *&L);//———————————————输出线性表DispList
void CreateList(SqList *&L,ElemType a[],int n);//———— 1.建立线性表CreateList
void InitList(SqList * &L);//—————————————— 2.初始化线性表InitList
void DestroyList(SqList * &L);//—————————————3.销毁线性表DestroyList
bool ListInsert(SqList *&L,int i,ElemType &e);//—————4.插入数据元素ListInsert
bool ListDelete(SqList *&L,int i,ElemType &e);//—————5.删除数据元素ListDelete
int ListLength(SqList *&L);//—————————————— 6.求线性表的长度ListLength的
bool GetElem(SqList *&L,int i,ElemType &e);//—————— 7.求线性表L中指定位置(e)的某个数据元素GetElem
int LocateElem(SqList *&L,ElemType e);//—————————8.查找元素LocateElem
//定义用于驱动测试的main函数
int main()
{
int i;
ElemType e;
SqList *sq;//定义一顺序表,结构体
ElemType x[6]={1,2,3,4,5,6};//定义一个数组并赋值
//1.
CreateList(sq, x, 6);//调用“建立线性表”
DispList(sq);//调用“输出线性表”
ListEmpty(sq);//判断线性表是否为空
//2.
InitList(sq);//初始化线性表
DispList(sq);//调用“输出线性表”
//3.
CreateList(sq, x, 6);//调用“建立线性表”
DestroyList(sq);//销毁线性表
DispList(sq);//调用“输出线性表”
//4.
i=2;
e=5;
CreateList(sq, x, 6);//调用“建立线性表”
ListInsert(sq,i,e);//插入数据元素
DispList(sq);//调用“输出线性表”
//5.
ListDelete(sq,i,e);//删除数据元素
DispList(sq);//调用“输出线性表”
//6.
int l;
l=ListLength(sq);//求线性表的长度
printf("%d ",l);
printf("\n");
//7.
int n;
GetElem(sq,i,n);//求线性表L中指定位置(e)的某个数据元素
printf("%d ",n);
printf("\n");
//8.
int m;
m=LocateElem(sq,e);//查找元素
printf("%d ",m);
printf("\n");
return 0;
}
//定义各个自定义函数
void CreateList(SqList *&L,ElemType a[],int n)//————————1.“建立线性表”的算法CreateList
{
int i;
L=(SqList *)malloc(sizeof(SqList));//分配空间
for(i=0;i<n;i++)//把数组的值赋予线性表
L->data[i]=a[i];
L->length=n;//赋予表长
}
bool ListEmpty(SqList *L)//——————————实现判断线性表是否为空的算法ListEmpty
{
if(L->length==0)
{
printf("线性表为空\n");
return true;
}
else
return false;
}
void DispList(SqList *&L)//——————————实现“输出线性表”的算法DispList
{
int i;
if(ListEmpty(L))//判断是不是空表
return;
for (i=0; i<L->length; i++) //输出
printf("%d ",L->data[i]);
printf("\n"); //换行
}
void InitList(SqList * &L)//————————————2.初始化线性表InitList
{
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
void DestroyList(SqList * &L)//————————————3.销毁线性表DestroyList
{
free(L);
}
bool ListInsert(SqList *&L,int i,ElemType &e)//————————————4.插入数据元素ListInsert
{
if(i<1||i>L->length)
return false;
i--;
for(int j=L->length;j>i;j--)
{
L->data[j]=L->data[j-1];
}
L->length++;
L->data[i]=e;
return true;
}
bool ListDelete(SqList *&L,int i,ElemType &e)//————————————5.删除数据元素ListDelete
{
if(i<1||i>L->length)
return false;
i--;
e=L->data[i];
for(int j=i;j<L->length-1;j++)
L->data[j]=L->data[j+1];
L->length--;
return true;
}
int ListLength(SqList *&L)//————————————6.增加求线性表的长度ListLength的函数
{
return(L->length);
}
bool GetElem(SqList *&L,int i,ElemType &e)//————————————7.增加求线性表L中指定位置(e)的某个数据元素GetElem的函数
{
if(i<1||i>L->length)
return false;
e=L->data[i-1];
return true;
}
int LocateElem(SqList *&L,ElemType e)//————————————8.增加查找元素LocateElem的函数
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
小结:从运行结果来看,第一行成功的建立了一个顺序表,并进行了输出。第二行对已经行初始化的顺序表进行输出,在判断线性表是否为空的函数中加入了如果为空则输出“线性表为空”的指令,所以第二行的输出证明初始化也是成功的。第三行进行了销毁线性表的操作,从结果什么都没有来看,销毁和初始化是并不一样的。第四行进行了插入操作,在第二的位置插入一个5。第五行则是删除上一步增加的5。倒数第三行输出的6为线性表长度,倒数第二行为查看第二个位置上的元素(其中用到了引用作为形参),最后一行为查找5在第几个位置(直接返回值)。各种操作均有非常巧妙的地方。