相信大家初学数据结构都逃不掉要深挖底层逻辑代码的习惯,
以下是对顺序表的解读:
--------------------------------------------------------------------------------------------------------
//#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>#include<process.h>
#define MaxSize 50 //定义线性表 容量 50个元素
typedef int ElemType; //约定顺序表的数据元素类型为整形,如果后面想改元素类型 直接改int
typedef struct
{
ElemType data[MaxSize]; //存放的顺序表中的int元素 data 不超过50个
int length; //当前顺序表的长度
}SqList; //这个结构体名字定义为 顺序表
void CreateList(SqList *&L,ElemType a[],int n) //创建顺序表, L表示 , 由数组a中的n个元素建立顺序表
{
int i=0,k=0; //i表示下面的循环 k表示L中元素的个数,初始值为0
L=(SqList *)malloc(sizeof(SqList)); //分配存放顺序表的空间
while (i<n) //i 扫描数组a 的元素
{
L->data[k]=a[i]; //将元素a[i]存放到L中
k++;i++; //一个一个的存放,每次存放 K+1
}
L->length=k; //此时顺序表L的长度等于K
}
void InitList(SqList *&L) //初始化线性表 顺序表由L 表示
{
L=(SqList *)malloc(sizeof(SqList)); //分配存放顺序表的空间
L->length=0; //长度的初始值为0
}
void DestroyList(SqList *&L) //销毁线性表
{
free(L); //释放L所指的顺序表空间
}
bool ListEmpty(SqList *L) //判断线性表是否为空表
{
return(L->length==0);
}
int ListLength(SqList *L) //求线性表长度
{
return(L->length);
}
void DispList(SqList *L) //输出线性表
{
for (int i=0;i<L->length;i++) //扫描顺序表 ,输出各元素值
printf("%d",L->data[i]);
printf("\n");
}
bool GetElem(SqList *L,int i,ElemType &e) //按序号求线性表中的元素
{
if (i<1 ||i>L->length) //确认查找的值在范围内,错误返回Flase
return false;
e=L->data[i-1]; //取元素值 数组的序号是0开始
return true; //成功找到返回true
}
int LocateElem(SqList *L,ElemType e) //按元素值查找
{
int i=0;
while(i<L->length && L->data[i]!=e) //确认条件 小于L的长度 且 数组值不等于e 一直循环
i++;
if(i>=L->length)
return 0; //如果>=L长度 返回0 未找到
else
return i+1; //找到后返回其逻辑序号
}
bool ListInsert(SqList *&L,int i,ElemType e) //插入数据元素
{
int j;
if(i<1 || i>L->length+1 || L->length==MaxSize) //确认条件 确认顺序表是否超出最大值
return false;
i--; //将顺序表的逻辑序号为物理序号
for(j=L->length;j>i;j--)
L->data[j]=L->data [j-i]; // J指向顺序表的最后一位空格 前面一个一个交换 直到要插入的地方
L->data[i]=e;
L->length++;
return true;
}
bool ListDelete(SqList *&L,int i,ElemType &e) //删除数据元素
{
int j;
if (i<1 || i>L->length)
return false;
i--; //逻辑序号化成物理序号
e=L->data[i];
for(j=i;j<L->length-1;j++) //J指向顺序表要删除的元素
L->data[i]=L->data[j+1]; //把要删除的元素直接替换成下一个的元素 直到换完
L->length--; // 这时候顺序表长度减去刚刚删除的元素 - 1
return true;
}
int main()
{
SqList *L;
ElemType e;
printf( "初始化**表L\n" );
InitList(L);
printf( "依次插入a,b,c,d,e元素:\n" );
ListInsert(L,1,'a');
ListInsert(L,2,'b');
ListInsert(L,3,'c');
ListInsert(L,4,'d');
ListInsert(L,5,'e');
printf("输出**表L:");
DispList(L);
printf( "\n输出**表的长度为:%d",ListLength(L) );
if(ListEmpty(L))
printf("\n线性表为空");
else
printf("\n线性表非空");
GetElem(L,3,e);
printf( "\n**表L的第三个元素为:%d\n", e );
printf( "a元素的位置为:%d\n" , LocateElem(L,'a') );
printf( "在第4个元素位置插入f\n" );
ListInsert(L,4,'f');
printf( "输出**表L:" );
DispList(L);
printf( "删除**表L的第3个元素\n" );
ListDelete(L,3,e);
printf( "输出**表L:");
DispList(L);
printf( "释放**表L\n");
DestroyList(L);
return 0;
}