顺序表
#include<stdio.h>
#include<malloc.h>
#define MaxSize 50
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
}SqList;
/*
*1.由已给数组元素创建顺序表,创建顺序表
*/
void CreateList(SqList *&L,ElemType a[],int n)
{
int i=0,k=0;
L = (SqList*)malloc(sizeof(SqList));
while(i<n)
{
L->data[i] = a[i];
k++;
i++;
}
L->length=k;
}
/*
*2.初始化一个空的顺序表
*/
void InitList(SqList * &L)
{
L = (SqList *)malloc(sizeof(SqList));//分配存放线性表的空间
L->length = 0; //置空线性表的长度为0
}
/*
*3.销毁顺序表
*/
void DestroyList(SqList *&L)
{
free(L);//释放指针L所指向的内存空间
}
/*
*4.求顺序表的长度
*/
int Length(SqList *L)
{
return L->length;
}
/*
*5.输出顺序表各元素值
*/
void Display(SqList *L)
{
int i=0;
for(i;i<L->length;i++)
{
if(i!=L->length-1)
printf("%d ",L->data[i]);
else{
printf("%d\n",L->data[i]);
}
}
}
/*
*6.求顺序表中指定逻辑顺序的元素值
*参数L:顺序表指针
*参数i:顺序表中要获取元素的逻辑顺序
*参数e:引用参数,用于返回要获取元素的值
*返回值:成功返回rue,失败返回false
*/
bool GetElem(SqList *L,int i,ElemType &e)
{
if(i<1||i>L->length)
return false;
e = L->data[i-1]; //逻辑顺序映-1变为对应物理顺序
return true;
}
/*
*7.按指定值查找顺序表对应元素,并返回其对应逻辑序号
*/
int LocateElem(SqList *L,ElemType e)
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i==L->length)
return 0; //未找到返回0
return i+1; //找到后返回其逻辑序号
}
/*
*8.插入指定元素到顺序表的指定位置
*/
bool ListInsert(SqList *&L,int i,ElemType e)
{
if(i<1||i>L->length+1)
return false; //参数i不合法时返回false
i--; //将逻辑序号转化为物理序号
int j;
for(j=L->length;j>i;j--)//将data[i]及后面的元素后移一个位置
L->data[j] = L->data[j-1];
L->data[i]=e; //插入元素e
L->length++; //顺序表长度加一
return true; //插入成功返回true
}
/*
*9.删除指定逻辑位置的数据元素
*/
bool ListDelete(SqList *L,int i,ElemType &e)
{
if(i<1||i>L->length)
return false;
int j;
i--;
e = L->data[i]; //将要删除元素赋值给e
for(j=i;j<L->length-1;j++) //顺序表中data[i]之后的元素向前移动一位
L->data[j]=L->data[j+1];
L->length--; //顺序表的长度-1;
return true; //成功返回true
}
int main()
{
printf(">>>>>>>>>>>>>>>>>>>>>>>Test1<<<<<<<<<<<<<<<<<<<<<<<<<\n");
//测试一:通过整形数组a[]={5,4,1,5,6}创建其对应的顺序表
ElemType a[]={5,4,1,5,6};
SqList *L;
CreateList(L,a,sizeof(a)/sizeof(ElemType));
Display(L);
printf("Length of List:%d\n",L->length);
//测试二:创建一个顺序表
//在末尾插入 5,8,1,7并输出顺序表所有元素
//输出元素1逻辑序号
//删除逻辑序号为2的元素并输出顺序表所有元素与被删除的元素值
SqList *L2;
InitList(L2);
ListInsert(L2,L2->length+1,5);
ListInsert(L2,L2->length+1,8);
ListInsert(L2,L2->length+1,1);
ListInsert(L2,L2->length+1,7);
Display(L2);
printf(">>>>>>>>>>>>>>>>>>>>>>>Test2<<<<<<<<<<<<<<<<<<<<<<<<<\n");
printf("Logic number of element 1 is:%d\n",LocateElem(L2,1));
ElemType re;
ListDelete(L2,2,re);
printf("The number %d has been delete.\n",re);
Display(L2);
DestroyList(L);//销毁顺序表
DestroyList(L2);
L=NULL;//将指针设为空指针
L2=NULL;
}
运行结果: