文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 前言
- 一、顺序表的定义
- 二、顺序表的基本操作
- 1.头文件及宏定义
- 2.结构体定义
- 3.顺序表初始化
- 4.动态增加数组长度
- 5.顺序表遍历
- 6.顺序表长度
- 7.顺序表判空
- 8.顺序表的插入操作(在指定位置上插入指定的元素)
- 9.顺序表的删除操作(删除指定位置上的元素)
- 10.顺序表的删除操作(删除指定的元素)
- 11.查找指定元素所在的位置
- 12.查找指定位置上的元素
- 13.顺序表销毁
- 三、代码
- 总结
前言
一、顺序表的定义
线性表的顺序存储又称为顺序表。【一组地址连续的存储空间】
二、顺序表的基本操作 1.头文件及宏定义#include2.结构体定义#include #include #define InitSize 10 //默认的最大长度
typedef struct {
int* data;//动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SqList;
3.顺序表初始化
void InitList(SqList *L) {
//用malloc函数申请一片连续的存储空间 格式:(分配类型 *)malloc(分配元素个数 *sizeof(分配类型))
L->data = (int*)malloc(InitSize * sizeof(int));
//(*L).data = (int*)malloc(InitSize * sizeof(int));
L->length = 0; //当前长度设置为0
L->MaxSize = InitSize;
}
4.动态增加数组长度
void IncreaseSize(SqList * L, int len) {
int* p = L->data; // 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; //顺序表的最大长度增加len
free(p); //释放原来的内存空间
}
5.顺序表遍历
void PrintList(SqList* L) {
for (int i = 0; i < L->length; i++) {
printf("data[%d]=%dn", i, L->data[i]);
}
}
6.顺序表长度
int ListLength(SqList *L) {
return L->length;
}
7.顺序表判空
void ListEmpty(SqList*L) {
int emptyFlag =L->length==0?1:0;
if (emptyFlag==1)
{
printf("顺序表为空!n");
}
else{
printf("顺序表bu为空!n");
}
}
8.顺序表的插入操作(在指定位置上插入指定的元素)
void ListInsert(SqList* L, int i, int e) {
if (i<1 || i>L->length + 1) {
printf("Insert failed!n");
return;
}
else{
if (L->length >= L->MaxSize) {
IncreaseSize(&L, 5); //自动增加5个长度
}
for (int j = L->length; j >= i; j--) //将第i个位置及其后面所有的元素向后移
{
L->data[j] = L->data[j - 1];
}
L->data[i - 1] = e; //第i个位置对应数组中i-1编号位置
L->length++;
return;
}
}
9.顺序表的删除操作(删除指定位置上的元素)
void ListDelete(SqList* L, int i) {
if (i<1 || i>L->length + 1) {
printf("Delete failed!n");
return;
}
else
{
for (int j = i-1; j length-1; j++) //将第i个位置及其后面所有的元素向后移
{
L->data[j] = L->data[j+1];
}
L->length--;
return;
}
}
10.顺序表的删除操作(删除指定的元素)
void ListDeleteElem(SqList* L, int e) {
//1.查找元素e所在的位置
int flag = 0; //用来标志是否查找到
for (int i = 0; i < L->length; i++)
{
//2.删除查找元素e
if (L->data[i] == e)
{
for (int j = i; j < L->length; j++) //将第i个位置及其后面所有的元素向后移
{
L->data[j] = L->data[j + 1];
}
L->length--;
flag++;
}
}
if (flag != 0)
{
printf("未查找到元素[%d],故Delete failed!n", e);
return;
}
else
{
printf("Delete succeed!n");
return;
}
return;
}
11.查找指定元素所在的位置
void ListLocateElem(SqList* L, int e) {
int locat[100];//用于存放元素e的位置
int flag = 0; //用来标志是否查找到
for (int i = 0,j=0; i < L->length; i++)
{
if (L->data[i] == e)
{
locat[j] = i + 1;
j++;
flag = j;
}
}
if (flag !=0)
{
printf("元素[%d]所在的位置为:",e);
for (int i = 0; i < flag; i++)
{
printf("%d ",locat[i]);
}
printf("n");
}
else
{
printf("元素[%d]未查找到!n",e);
}
return 0;
}
12.查找指定位置上的元素
int getElme(SqList *L,int i) {
if (i<0||i>L->length)
{
printf("超过查找位置的范围,get failed!n");
return -1;
}
else
{
printf("第%d上的元素为:%dn",i,L->data[i]);
return L->data[i - 1];
}
}
13.顺序表销毁
void DestroyList(SqList*L) {
L->length = 0;
L->MaxSize = 0;
free(L->data);
L->data = NULL;
}
三、代码
代码如下(示例):(顺序表静态分配方式)
#include//顺序表的类型定义(静态分配方式) #include #define MaxSize 100 //定义表的最大长度 typedef struct { int data[MaxSize];//用静态的"数组"存放数据元素 int length; //顺序表的当前长度 }SqList; //初始化顺序表 void InitList(SqList * L) { for (int i = 0; i < MaxSize; i++) { L->data[i] = 0; //将所有数据元素设置为默认初始值0 } L->length = 0;//当前长度为0 } //遍历操作 void PrintList(SqList *L) { for (int i = 0; i < MaxSize; i++) { printf("data[%d]=%dn",i,L->data[i]); } } int main() { SqList L;//声明一个顺序表 InitList(&L);//初始化一个顺序表 //遍历顺序表 PrintList(&L); return 0; }
代码如下(示例):(顺序表动态分配方式)
#include总结#include #include #define InitSize 10 //默认的最大长度 typedef struct { int* data;//指示动态分配数组的指针 int MaxSize; //顺序表的最大容量 int length; //顺序表的当前长度 }SqList; //初始化 void InitList(SqList *L) { //用malloc 函数申请一片连续的存储空间 (分配类型 *)malloc(分配元素个数 *sizeof(分配类型)) L->data = (int*)malloc(InitSize * sizeof(int)); //(*L).data = (int*)malloc(InitSize * sizeof(int)); L->length = 0; L->MaxSize = InitSize; } //增加动态数组的长度 void IncreaseSize(SqList * L, int len) { int* p = L->data; // 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; //顺序表最大长度增加len free(p); //释放原来的内存空间 } //遍历 void PrintList(SqList* L) { for (int i = 0; i < L->length; i++) { printf("data[%d]=%dn", i, L->data[i]); } } //求表长 int ListLength(SqList *L) { return L->length; } //判空 void ListEmpty(SqList*L) { int emptyFlag =L->length==0?1:0; if (emptyFlag==1) { printf("顺序表为空!n"); } else { printf("顺序表bu为空!n"); } } //顺序表的插入操作 void ListInsert(SqList* L, int i, int e) { if (i<1 || i>L->length + 1) { printf("Insert failed!n"); return; } else { if (L->length >= L->MaxSize) { IncreaseSize(&L, 5); //自动增加5个长度 } for (int j = L->length; j >= i; j--) //将第i个位置及其后面所有的元素向后移 { L->data[j] = L->data[j - 1]; } L->data[i - 1] = e; //第i个位置对应数组中i-1编号位置 L->length++; return; } } //顺序表的删除操作(删除指定位置上的元素) void ListDelete(SqList* L, int i) { if (i<1 || i>L->length + 1) { printf("Delete failed!n"); return; } else { for (int j = i-1; j length-1; j++) //将第i个位置及其后面所有的元素向后移 { L->data[j] = L->data[j+1]; } L->length--; return; } } //查找元素e所在的位置 void ListLocateElem(SqList* L, int e) { int locat[100];//用于存放元素e的位置 int flag = 0; //用来标志是否查找到 for (int i = 0,j=0; i < L->length; i++) { if (L->data[i] == e) { locat[j] = i + 1; j++; flag = j; } } if (flag !=0) { printf("元素[%d]所在的位置为:",e); for (int i = 0; i < flag; i++) { printf("%d ",locat[i]); } printf("n"); } else { printf("元素[%d]未查找到!n",e); } return 0; } //顺序表的删除操作(删除指定的元素e) void ListDeleteElem(SqList* L, int e) { //1.查找元素e所在的位置 int flag = 0; //用来标志是否查找到 for (int i = 0; i < L->length; i++) { //2.删除查找元素e if (L->data[i] == e) { for (int j = i; j < L->length; j++) //将第i个位置及其后面所有的元素向后移 { L->data[j] = L->data[j + 1]; } L->length--; flag++; } } if (flag != 0) { printf("未查找到元素[%d],故Delete failed!n", e); return; } else { printf("Delete succeed!n"); return; } return; } //查找第i个位置上的元素 int getElme(SqList *L,int i) { if (i<0||i>L->length) { printf("超过查找位置的范围,get failed!n"); return -1; } else { printf("第%d上的元素为:%dn",i,L->data[i]); return L->data[i - 1]; } } //销毁操作 void DestroyList(SqList*L) { L->length = 0; L->MaxSize = 0; free(L->data); L->data = NULL; } int main(void) { SqList L; //声明一个顺序表 InitList(&L);//初始化顺序表 IncreaseSize(&L, 5); //增加5个长度容量 ListInsert(&L, 1, 1); //插入元素 ListInsert(&L, 1, 2); ListInsert(&L, 1, 3); ListInsert(&L, 3, 4); ListInsert(&L, 3, 4); ListInsert(&L, 4, 5); PrintList(&L); //遍历顺序表 int length =ListLength(&L); printf("顺序表的长度为:%dn",length); ListEmpty(&L); //判空 ListDelete(&L, 1);//删除指定位置上的元素 PrintList(&L); //遍历顺序表 ListLocateElem(&L, 4); //查找元素所在的位置 ListLocateElem(&L, 100); getElme(&L, 5);//查找指定位置上的元素 getElme(&L, 100); ListDeleteElem(&L, 4); //删除指定元素 PrintList(&L); //遍历顺序表 return 0; }
多思考,多敲,代码是敲出来的,不是梦出来的!



