1 顺序表定义
1.1 顺序表定义(静态分配)
-
- c语言实现
#include <stdio.h>
#define MaxSize 10 //定义最大长度
// #define ElemType int
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize]; //用静态数组存放元素
int length; //顺序表当前长度
}Sqlist; //顺序表类型定义
//初始化顺序表
void InitList(Sqlist *L){
for (int i = 0; i < MaxSize; i++)
//使用 -> 运算符,访问指向该结构的指针结构的成员
L->data[i]=0; //将所有数据元素设置为默认初始值
L->length = 0; //顺序表初始长度为0
}
// Sqlist InitList(Sqlist *L){
// for (int i = 0; i < MaxSize; i++)
// L->data[i]=0; //将所有数据元素设置为默认初始值
// L->length = 0; //顺序表初始长度为0
// return *L;
// }
int main(){
Sqlist L; //声明一个顺序表
InitList(&L); //初始化顺序表,通过传顺序表的地址初始化顺序表
//打印顺序表
for(int i = 0; i < MaxSize; i++)
printf("data[%d]=%d\n",i,L.data[i]);
return 0;
}
-
- c++实现
#include <stdio.h>
#define ElemType int
#define MaxSize 10 //定义最大长度
typedef struct
{
ElemType data[MaxSize]; //用静态数组存放元素
int length; //顺序表当前长度
}Sqlist; //顺序表类型定义
//初始化顺序表
void InitList(Sqlist &L){
for (int i = 0; i < MaxSize; i++)
L.data[i]=0; //将所有数据元素设置为默认初始值
L.length = 0; //顺序表初始长度为0
}
// Sqlist InitList(Sqlist &L){
// for (int i = 0; i < MaxSize; i++)
// L.data[i]=0; //将所有数据元素设置为默认初始值
// L.length = 0; //顺序表初始长度为0
// return L;
// }
int main(){
Sqlist L; //声明一个顺序表
InitList(L); //初始化顺序表
//打印顺序表
for(int i = 0; i < MaxSize; i++)
printf("data[%d]=%d\n",i,L.data[i]);
return 0;
}
注意:C语言无&引用类型,所以采用结构体指针。
运行结果如下:
1.2 顺序表定义(动态分配)
- c++实现
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
#define InitSize 10 //默认最大长度
typedef struct
{
ElemType *data; //指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表当前长度
}Sqlist; //顺序表类型定义
//初始化顺序表
void InitList(Sqlist &L){
//用malloc函数申请一片连续的存储空间
L.data = (int *)malloc(InitSize*sizeof(int));
for (int i = 0; i < InitSize; i++)
L.data[i]=0; //将所有数据元素设置为默认初始值0
L.length = 0; //顺序表初始长度为0
L.MaxSize = InitSize;
}
//增加动态数组的长度
void IncreaseSize(Sqlist &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 = L.MaxSize + len;
free(p);
}
int main(){
Sqlist L; //声明一个顺序表
InitList(L); //初始化顺序表
//打印顺序表
for(int i = 0; i < InitSize; i++)
printf("data[%d]=%d\n",i,L.data[i]);
IncreaseSize(L,5);
printf("++++++++++\n");
for(int i = 0; i < L.MaxSize; i++)
printf("data[%d]=%d\n",i,L.data[i]);
return 0;
}
运行效果图如下:
- 初始化
- 动态增加5的长度
2 顺序表插入
- C++代码如下:
#include <stdio.h>
#include <stdlib.h>
#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; //将所有数据元素设置为默认初始值
L.length = 0; //顺序表初始长度为0
}
bool ListInsert(SqList &L,int i,int e){
if (i<1||i>L.length+1)//判断i范围是否有效,末尾可以插入
return false;
if(L.length >= MaxSize)//当前存储空间已满,不能插入
return false;
for(int j=L.length;j>=i;j--)//末尾插入不移动元素
L.data[j]=L.data[j-1];
L.data[i-1]=e;
L.length++;
return true;
}
int main(){
SqList L;
InitList(L);
//打印初始化顺序表
for(int i = 0; i < MaxSize; i++)
printf("data[%d]=%d\n",i,L.data[i]);
printf("执行插入操作后\n");
ListInsert(L,1,1);//初始化将表长度置为0;只能从第一个位置插入
ListInsert(L,2,2);
ListInsert(L,3,3);
ListInsert(L,4,4);
ListInsert(L,5,3);
//打印插入操作后的顺序表
for(int i = 0; i < MaxSize; i++)
printf("data[%d]=%d\n",i,L.data[i]);
return 0;
}
- 运行效果图如下:
3 顺序表删除
- C++代码如下:
#include <stdio.h>
#include <stdlib.h>
#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; //将所有数据元素设置为默认初始值
L.length = 0; //顺序表初始长度为0
}
bool ListInsert(SqList &L,int i,int e){
if (i<1||i>L.length+1)//判断i范围是否有效,末尾可以插入
return false;
if(L.length >= MaxSize)//当前存储空间已满,不能插入
return false;
for(int j=L.length;j>=i;j--)//末尾插入不移动元素
L.data[j]=L.data[j-1];//将第i个元素及之后的元素后移
L.data[i-1]=e;//在位置i处存放e
L.length++;//长度加一
return true;
}
bool ListDelete(SqList &L,int i, int &e){
if(i<1||i>L.length)//判断i范围是否有效
return false;
e = L.data[i-1]; //将被删除的元素赋给e
for(int j=i;j<L.length;j++)
L.data[j-1] = L.data[j];//将第i个位置后的元素前移
L.length--;//线性表长度减一
return true;
}
int main(){
SqList L;
InitList(L);
//打印初始化顺序表
for(int i = 0; i < MaxSize; i++)
printf("data[%d]=%d\n",i,L.data[i]);
printf("执行插入操作后\n");
ListInsert(L,1,1);//初始化将表长度置为0;只能从第一个位置插入
ListInsert(L,2,2);
ListInsert(L,3,3);
ListInsert(L,4,4);
ListInsert(L,5,5);
//打印插入操作后的顺序表
for(int i = 0; i < L.length; i++)
printf("data[%d]=%d\n",i,L.data[i]);
printf("执行删除操作后\n");
int e = -1;
if(ListDelete(L,3,e))
printf("已删除第3个元素,删除元素的值为%d\n",e);
else
printf("位序i不合法,删除失败!\n");
//打印插入操作后的顺序表
for(int i = 0; i < L.length; i++)
printf("data[%d]=%d\n",i,L.data[i]);
return 0;
}
- 运行效果图如下:
4 顺序表查找
- C++代码如下:
#include <stdio.h>
#include <stdlib.h>
#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; //将所有数据元素设置为默认初始值
L.length = 0; //顺序表初始长度为0
}
//插入元素
bool ListInsert(SqList &L,int i,int e){
if (i<1||i>L.length+1)//判断i范围是否有效,末尾可以插入
return false;
if(L.length >= MaxSize)//当前存储空间已满,不能插入
return false;
for(int j=L.length;j>=i;j--)//末尾插入不移动元素
L.data[j]=L.data[j-1];//将第i个元素及之后的元素后移
L.data[i-1]=e;//在位置i处存放e
L.length++;//长度加一
return true;
}
//删除元素
bool ListDelete(SqList &L,int i, int &e){
if(i<1||i>L.length)//判断i范围是否有效
return false;
e = L.data[i-1]; //将被删除的元素赋给e
for(int j=i;j<L.length;j++)
L.data[j-1] = L.data[j];//将第i个位置后的元素前移
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 i+1;
}
}
return 0;
}
int main(){
SqList L;
InitList(L);
//打印初始化顺序表
for(int i = 0; i < MaxSize; i++)
printf("data[%d]=%d\n",i,L.data[i]);
printf("执行插入操作后\n");
ListInsert(L,1,1);//初始化将表长度置为0;只能从第一个位置插入
ListInsert(L,2,2);
ListInsert(L,3,3);
ListInsert(L,4,4);
ListInsert(L,5,5);
//打印插入操作后的顺序表
for(int i = 0; i < L.length; i++)
printf("data[%d]=%d\n",i,L.data[i]);
printf("执行删除操作后\n");
int e = -1;
if(ListDelete(L,3,e))
printf("已删除第3个元素,删除元素的值为%d\n",e);
else
printf("位序i不合法,删除失败!\n");
//打印插入操作后的顺序表
for(int i = 0; i < L.length; i++)
printf("data[%d]=%d\n",i,L.data[i]);
//查找第3位元素
printf("第3位元素值为:%d\n",GetElem(L,3));
//查找元素值为4的元素位序
printf("值为4的元素位序:%d\n",LocateElem(L,4));
return 0;
}
- 运行效果图如下: