顺序表基本运算算法
#include<stdio.h>
#include<malloc.h>
#define Maxsize 50
typedef int ElemType;
typedef struct
{
ElemType data[Maxsize]; //存放线性表中的元素
int length; //存放线性表的长度
}SqList; //顺序表类型
//建立顺序表
void CreateList(SqList *&L,ElemType a[],int n) //由a中的n个元素建立顺序表
{
int i=0,k=0; //k表示L中的元素个数,初始值为0
L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间
while(i<n) //i扫描数组a的元素
{
L->data[k]=a[i]; //将元素a[i]存放到L中
k++;i++;
}
L->length=k; //设置L的长度k
}
//初始化线性表:构造一个空的线性表L,只需分配线性表的存储空间并将length设置为0即可
void InitList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间
L->length=0; //置空线性表的长度为0
}
//销毁线性表:释放线性表L占用的内存空间(每次用完记得销毁)
void DestroyList(SqList *&L)
{
free(L); //释放L所指的顺序表空间
}
//判断线性表是否为空表:返回布尔值表示L是否为空表
bool ListEmpty(SqList *L)
{
return(L->length==0);
}
//求线性表的长度:返回顺序表L的长度,只需返回length域的值即可
int ListLength(SqList *L)
{
return(L->length);
}
//输出线性表:依次显示L中各元素的值
void DispList(SqList *L)
{
for(int i=0;i<L->length;i++) //扫描顺序表输出各元素值
printf("%d",L->data[i]);
printf("\n");
}
//求线性表中的某个数据元素值:用引用型参数e返回L中第i个(1≤i≤n)个元素的值
bool GetElem(SqList *L,int i,ElemType &e)
{
if(i<1||i>L->length)
return false; //参数i错误时返回false
e=L->data[i-1]; //取元素值
return true; //成功找到元素时返回true
}
//按元素值查找:顺序查找第一个值域与e相等的元素的逻辑序号(找到后返回一个大于0的值,否则返回0)
int LocateElem(SqList *L,ElemType e)
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++; //查找元素e
if(i>=L->length) //未找到时返回0
return 0;
else
return i+1; //找到后返回其逻辑序号
}
//插入数据元素:在顺序表L的第i(1≤i≤n+1)个位置上插入新元素e。
//顺序表原来第i个元素及以后的元素均后移一个位置,并从最后一个元素an开始移动
//腾出一个空位插入新元素,最后顺序表的长度增1并返回true,i值不正确则返回false
bool ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if(i<1||i>L->length+1||L->length==Maxsize)
return false; //参数i错误时返回false
i--; //将顺序表逻辑好转化为物理序号
for(j=L->length;j>i;j--) //将data[i]及后面的元素后移一个位置
L->data[j]=L->data[j-1];
L->data[i]=e; //插入元素e
L->length++; //顺序表长度增1
return true; //成功插入返回true
}
//删除数据元素:删除顺序表L的第i(1≤i≤n+1)个元素
//i值不正确,返回false;否则将线性表第i个元素以后的元素均向前移动一个位置,并从元素an+1开始移动起
//覆盖了原来第i个元素,达到了删除该元素的目的,最后顺序表的长度减1并返回true
bool ListDelete(SqList *&L,int i,ElemType &e)
{
int j;
if(i<1||i>L->length) //参数i错误时返回false
return false;
i--; //将顺序表逻辑序号转化为物理序号
e=L->data[i];
for(j=i;j<L->length-1;j++) //将data[i]之后的元素前移一个位置
L->data[j]=L->data[j+1];
L->length--; //顺序表的长度减1
return true; //成功删除返回true
}