一、顺序表的定义:(静态、动态分配内存)
#include<iostream>
using namespace std;
/**
静态分配存储空间
*/
//#define MaxSize 10//定义最大存储空间大小
//
//typedef struct
//{
// int data[MaxSize];
// int length;//定义线性表中当前的长度
//}SqList;//顺序表类型的定义(相当于一个新的数据类型)
基本操作——初始化线性表
//void InitList(SqList &L)
//{
// for(int i=0;i<MaxSize;i++)
// L.data[i]=0;//将所有数据元素设置为默认值
// /**如果没有这个循环,初始化表的数据值可能不为默认值,
// 这是由于内存可能有遗留的“垃圾数据”。
// 这个for循环可要可不要,因为在真正的数据操作中,要处理的数据元素
// 会覆盖掉里边的所谓的“垃圾数据”
// */
// L.length=0;//顺序表的初始长度为0
//}
/**
动态分配存储空间
*/
#define InitSize 10//默认最大长度
typedef struct
{
int *data;//指示动态分配数组的指针
int Maxsize;//顺序表的最大容量
int length;//顺序表的当前长度
}SeqList;
//基本操作——初始化表
void InitSqList(SeqList &L)
{
//用malloc函数动态申请连续的存储空间
L.data=(int *)malloc(sizeof(int)*InitSize);
L.length=0;
L.Maxsize=InitSize;
}
//增加动态数组的长度realloc()函数也可以实现此操作
//void IncreaseSize(SeqList &L,int len)
//{
// int *p=L.data;
// L.data=(int *)malloc(L.Maxsize+len*sizeof(int));
// for(int i=0;i<L.length;i++)
// L.data[i]=p[i];
// L.Maxsize+=len;
// free(p);
//}
int GetElem(SeqList L,int i)//获取第i个元素
{
return L.data[i-1];
}
int main()
{
SeqList L;
InitSqList(L);
cout<<"初始化顺序表默认最大长度为10,我们设置要存的元素个数n为:";
int n;
cin>>n;
cout<<"输入要存的这n个元素:"<<endl;
for(int i=0;i<n;i++)
{
cin>>L.data[i];
L.length++;
}
cout<<"获取第3个元素的值:"<<GetElem(L,3)<<endl;
return 0;
}
注:下边的代码中一些含参函数有“&”的运用,如果有读者不理解其作用可以先看看C语言和c++中的引用调用
二、顺序表的基本操作:
#include<iostream>
#define Initsize 10
using namespace std;
typedef struct
{
int *data;
int length;
int Maxsize;
}SqList;
//初始化顺序表
void InitList(SqList &L)
{
L.data=(int *)malloc(Initsize*sizeof(int));
L.Maxsize=Initsize;
for(int i=0;i<L.Maxsize;i++)
L.data[i]=0;
L.length=0;
}
//插入元素
bool InsertList(SqList &L,int pos,int elem)
{
if(pos<1||pos>L.length)//判断pos的范围是否合法
return false;
if(L.length>=Initsize)//若存储空间已经满了,也不能插入元素
return false;
/*插入元素时,将插入位置往后的元素(包括自身)往后移动
*并且注意得总后边开始往后边挪动,防止元素被覆盖
*/
for(int j=L.length-1;j>=pos-1;j--)
L.data[j+1]=L.data[j];
L.data[pos-1]=elem;
L.length++;
return true;
}
//删除元素
bool DeleteList(SqList &L,int pos,int &e)//删除pos-1位置上的元素,并用e返回删除元素的值
{
if(pos<1||pos>L.length)
return false;
/*接下来开始进行删除操作
*用e记录删除元素的值
*并将删除位置后边的元素往前移动(注意这次移动是从前开始)
*/
e=L.data[pos-1];
for(int i=pos-1;i<L.length-1;i++)
L.data[i]=L.data[i+1];
L.length--;
return true;
}
//按位查找
int GetElem(SqList L,int pos)
{
return L.data[pos-1];
}
//按值查找
int LocateElem(SqList L,int elem)
{
bool flag=false;
for(int i=0;i<L.length;i++)
{
if(L.data[i]==elem)
{
flag=true;
return i+1;
}
}
if(flag==false)
return -1;
}
int main()
{
int n;
cin>>n;
SqList sq;
InitList(sq);//申请内存
for(int i=0;i<n;i++)
{
cin>>sq.data[i];
sq.length++;
}
for(int i=0;i<sq.length;i++)
cout<<"顺序表中的第"<<i+1<<"个元素的值为:"<<sq.data[i]<<endl;
cout<<"获取第2个元素值为:"<<GetElem(sq,2)<<endl;
cout<<"获取值为5的元素的位置:"<<LocateElem(sq,5)<<endl;
cout<<"在第3个位置处插入元素5,新的顺序表为:"<<endl;
InsertList(sq,3,5);
for(int i=0;i<sq.length;i++)
cout<<"顺序表中的第"<<i+1<<"个元素的值为:"<<sq.data[i]<<endl;
int x;
DeleteList(sq,3,x);
cout<<"删除第3个元素,删除的元素值为:"<<x<<endl;
cout<<"删除第3个元素,新的顺序表为:"<<endl;
for(int i=0;i<sq.length;i++)
cout<<"顺序表中的第"<<i+1<<"个元素的值为:"<<sq.data[i]<<endl;
return 0;
}