C语言线性表实现:顺序表-创新互联
文章目录:
本文名称:C语言线性表实现:顺序表-创新互联
标题路径:http://ybzwz.com/article/djiedp.html
- 概念理解:
- 1. 动态顺序表结构体:
- 2. 顺序表动态初始化:
- 3. 顺序表扩容:
- 4. 插入:
- 5. 删除:
- 6. 按位序查找:
- 7. 按值查找:
- 8. 输出顺序表:
- 9. 判断顺序表是否相等:
- 10.测试:
线性表:一种逻辑结构。
顺序表:采用顺序存储方式实现的线性表。
位序:从1开始。
数组下标:从0开始。
&引用符的使用:
函数参数带&和不带&的区别。
malloc:申请一整片连续的存储空间,返回一个指向该空间首地址的指针。
free:释放一整片连续的存储空间。
//顺序表的动态分配
#define InitSize 10 //初始大小
typedef struct{int* data;//指针,指向动态分配的内存空间的首地址
int length;//该顺序表的长度
int MaxSize;//该顺序表的大长度
}SeqList;
2. 顺序表动态初始化:void InitList(SeqList &L){//初始化顺序表,包括给顺序表L动态分配内存空间,设置顺序表当前长度为0,设置顺序表大长度100
L.data = (int*)malloc(sizeof(int) * InitSize);
L.length = 0;
L.MaxSize = 100;
}
3. 顺序表扩容:void IncreaseSize(SeqList &L,int len){//顺序表扩容
int* p = L.data;//创建一个指针指向顺序表当前内存空间的首地址,方便回收
L.data = (int*)malloc(sizeof(int) * (L.MaxSize+len));//重新请求一块更大的内存空间分配给该顺序表
L.MaxSize += len;//修改顺序表大长度
for(int i=0;i<=L.length;i++){L.data[i] = p[i];//将原内存空间中的数据复制到新申请的空间中
}
free(p);//释放原来的内存空间
}
4. 插入:bool ListInsert(SeqList &L,int i,int e){//插入元素e到顺序表位序为i的位置
if(i<1 || i>L.length+1){//判断插入位置是否合法
return false;
}
if(L.length == L.MaxSize){//判断顺序表是否已满
return false;
}
for(int j=L.length;j<=i;j++){//i位置及之后的元素后移一位(这里注意区分位序和数组下标的关系)
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;//插入数据
L.length++;//注意别忘了顺序表长度+1
return true;
}
5. 删除:bool ListDelete(SeqList &L,int i,int &e){//删除顺序表为序为i的数据元素,并将该元素的值赋给e
if(i<1 || i>L.length){return false;
}
e = L.data[i-1];//将被删除的元素的值赋值给e
for(int j=i;j//位序i之后的元素前移
L.data[j-1] = L.data[j];
}
L.length--;//注意别忘了顺序表长度-1
return true;
}
6. 按位序查找:int getElem(SeqList L,int i){//按位序查找,返回该位序上的元素
if(i<1 || i>L.length){//判断位置是否合法
return -1;
}
return L.data[i-1];
}
7. 按值查找:int LocateElem(SeqList L,int e){//按值查找,返回该值的位序
for(int j=0;jif(L.data[j] == e){ return j+1;//返回的是位序
}
}
return -1;
}
8. 输出顺序表:void printList(SeqList L){//输出顺序表的元素
printf("[");
for(int i=0;iprintf("%d ",L.data[i]);
}
printf("]\n");
}
9. 判断顺序表是否相等:bool equalsList(SeqList L1,SeqList L2){//判断顺序表内容是否相同
if(L1.MaxSize == L2.MaxSize){if(L1.length == L2.length){ for(int i=0;i if(L1.data[i] == L2.data[i]){continue;
}
}
}
return true;
}
return false;
}
10.测试:#include#include//使用malloc和free关键字需要引入这个库
//顺序表的动态分配
#define InitSize 10 //初始大小
typedef struct{int* data;//指针,指向动态分配的内存空间的首地址
int length;//该顺序表的长度
int MaxSize;//该顺序表的大长度
}SeqList;
void InitList(SeqList &L){//初始化顺序表,包括给顺序表L动态分配内存空间,设置顺序表当前长度为0,设置顺序表大长度100
L.data = (int*)malloc(sizeof(int) * InitSize);
L.length = 0;
L.MaxSize = 100;
}
void IncreaseSize(SeqList &L,int len){//顺序表扩容
int* p = L.data;//创建一个指针指向顺序表当前内存空间的首地址,方便回收
L.data = (int*)malloc(sizeof(int) * (L.MaxSize+len));//重新请求一块更大的内存空间分配给该顺序表
L.MaxSize += len;//修改顺序表大长度
for(int i=0;i<=L.length;i++){L.data[i] = p[i];//将原内存空间中的数据复制到新申请的空间中
}
free(p);//释放原来的内存空间
}
bool ListInsert(SeqList &L,int i,int e){//插入元素e到顺序表位序为i的位置
if(i<1 || i>L.length+1){//判断插入位置是否合法
return false;
}
if(L.length == L.MaxSize){//判断顺序表是否已满
return false;
}
for(int j=L.length;j<=i;j++){//i位置及之后的元素后移一位(这里注意区分位序和数组下标的关系)
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;//插入数据
L.length++;//注意别忘了顺序表长度+1
return true;
}
bool ListDelete(SeqList &L,int i,int &e){//删除顺序表为序为i的数据元素,并将该元素的值赋给e
if(i<1 || i>L.length){return false;
}
e = L.data[i-1];//将被删除的元素的值赋值给e
for(int j=i;j//位序i之后的元素前移
L.data[j-1] = L.data[j];
}
L.length--;//注意别忘了顺序表长度-1
return true;
}
int getElem(SeqList L,int i){//按位序查找,返回该位序上的元素
if(i<1 || i>L.length){//判断位置是否合法
return -1;
}
return L.data[i-1];
}
int LocateElem(SeqList L,int e){//按值查找,返回该值的位序
for(int j=0;jif(L.data[j] == e){ return j+1;//返回的是位序
}
}
return -1;
}
void printList(SeqList L){//输出顺序表的元素
printf("[");
for(int i=0;iprintf("%d ",L.data[i]);
}
printf("]\n");
}
bool equalsList(SeqList L1,SeqList L2){//判断顺序表内容是否相同
if(L1.MaxSize == L2.MaxSize){if(L1.length == L2.length){ for(int i=0;i if(L1.data[i] == L2.data[i]){continue;
}
}
}
return true;
}
return false;
}
int main(){SeqList L1;//声明一个顺序表
InitList(L1);//初始化顺序表
//初始化、扩容测试
printf("顺序表当前内存空间的首地址:%d\n",&L1.data[0]);
printf("顺序表当前大长度:%d\n",L1.MaxSize);
IncreaseSize(L1,5);//扩容顺序表,扩容长度为5
printf("顺序表当前内存空间的首地址:%d\n",L1.data);
printf("顺序表当前大长度:%d\n",L1.MaxSize);
//插入、输出测试
ListInsert(L1,1,5);
printList(L1);
//按位查找、按值查找测试
printf("顺序表中位序为1的元素为:%d\n",getElem(L1,1));
printf("顺序表中元素5的位序为:%d\n",LocateElem(L1,5));
//删除测试
int a;
ListDelete(L1,1,a);
printf("删除的元素为:%d\n",a);
printList(L1);
//判断顺序表数据相等测试
SeqList L2;//声明一个顺序表
InitList(L2);//初始化顺序表
ListInsert(L1,1,3);
ListInsert(L2,1,8);
printf("顺序表L1和L2是否相等:%d\n",equalsList(L1,L2));
ListDelete(L1,1,a);
ListInsert(L1,1,8);
IncreaseSize(L2,5);
printf("顺序表L1和L2是否相等:%d\n",equalsList(L1,L2));
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文名称:C语言线性表实现:顺序表-创新互联
标题路径:http://ybzwz.com/article/djiedp.html