顺序表的实现(动态分配)
下面展示一些 内联代码片
。
#include<stdio.h>
#include<stdlib.h> //要用到malloc、free函数
#define InitSize 10 //顺序表的初始长度
//顺序表类型定义,动态分配方式
typedef struct
{
int *data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int Length; //顺序表的当前长度
}SqList; //可以区别于静态分配SqList,当然,这个没什么影响
//基本方法
void InitList(SqList &L);
int GetLength(SqList L);
void IncreaseSize(SqList &L,int len);
bool ListInsert(SqList &L,int i,int e);
void PrintfList(SqList L);
bool ListDelete(SqList &L,int i,int &e);
int GetElem(SqList L,int i);
int LocateElem(SqList L,int e);
bool Empty(SqList L);
//具体方法实现
void InitList(SqList &L)
{
//用malloc函数申请一块连续的存储空间,malloc函数返回一个指针,需要强制转换为你定义的数据元素类型指针
L.data=(int *)malloc(InitSize*sizeof(int));
L.Length=0;
L.MaxSize=InitSize;
}
int GetLength(SqList L)
{
return L.Length;
}
void IncreaseSize(SqList &L,int len)
{
int *p=L.data; //p用来释放原本的空间用的
L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));
//将数据复制到新的区域
for(int i=0;i<L.Length;i++)
L.data[i]=p[i];
L.MaxSize=L.MaxSize+len;
free(p);
}
bool ListInsert(SqList &L,int i,int e)
{
if(i<0||i>L.Length+1)
return false;
if(L.Length>=L.MaxSize)
return false;
for(int j=L.Length;j>=i;i--)
L.data[j]=L.data[j-1];
L.data[i-1]=e;
L.Length++;
return true;
}
bool ListDelete(SqList &L,int i,int &e)
{
if(i<0||i>L.Length)
return false;
if(L.Length==0)
return false;
e=L.data[i-1];
for(int j=i;j<L.Length;j++)
{
L.data[j-1]=L.data[j];
}
L.Length--;
return true;
}
int GetElem(SqList L,int i)
{
return L.data[i-1];
}
int LocateElem(SqList L,int e)
{
for(int i=0;i<L.Length;i++)
{
if(L.data[i]==e)
return L.data[i];
}
}
void PrintfList(SqList L)
{
for(int i=0;i<L.Length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
bool Empty(SqList L)
{
if(L.Length==0)
return true;
else
return false;
}
void main()
{
SqList L; //定义一个顺序表
InitList(L);
ListInsert(L,1,0);
ListInsert(L,2,1);
ListInsert(L,3,2);
ListInsert(L,4,3);
ListInsert(L,5,4);
printf("表的长度=%d\n",GetLength(L));
PrintfList(L);
printf("申请空间的长度=%d\n",L.MaxSize);
IncreaseSize(L,10);
printf("申请空间的长度=%d\n",L.MaxSize);
int e=-1;
if(ListDelete(L,1,e))
printf("已经成功删除第一个元素,删除的元素=%d\n",e);
else
printf("位序输入错误,或者顺序表为空,删除失败\n");
printf("表的长度=%d\n",GetLength(L));
PrintfList(L);
printf("查找的第二个元素的值=%d\n",GetElem(L,2));
printf("元素的值为3的位序=%d\n",LocateElem(L,3));
if(Empty(L))
printf("顺序表为空\n");
else
printf("顺序表不为空\n");
}