顺序表的基本使用
此代码是日常学习的小结
!!!仅供参考,如有错误请谅解,欢迎评论区留言。谢谢大家
开发环境:devc++,及C语言和数据结构
/*
* date:2023.6.23
* content:顺序表的基本操作及动态内存分配
*/
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define InitSize 10
//定义结构体
typedef struct{
int *data;//动态分配数组指针
int MaxSize;//定义表的大小
int length; //记录表的长度
}SqList;
//表的初始化
void InitList(SqList* L){
//使用malloc函数初始化
L->data = (int *)(malloc)(sizeof(int)*InitSize);
L->length = 0;
L->MaxSize = InitSize;
for(int i=0;i<L->MaxSize;i++){
L->data[i] = i;//进行赋值
L->length++;//记录长度
}
}
//表的数组
void IncreaseSize(SqList* L,int len){
//如果需要增加数组长度
int *p = L->data;//用一个指针去指向第一个数
L->data = (int *)(malloc)(sizeof(int)*(L->MaxSize+len));//增加后的数组,data指向新数组的第一个数
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){//位序i出插入元素e
if(i<1 || i>L->length+1){
return false;
}
if(L->length>=L->MaxSize){
return false;
}
for(int j=L->length;j>=i;j--){
L->data[j] = L->data[j-1];//位序的后面元素都往后移
}
L->length++;
L->data[i-1] = e;
return true;
}
//表的删除
bool ListDelete(SqList* L,int i,int* e){
if(i<1 ||i>L->length){
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 i+1;//位序加1
}
}
return -1;
}
//打印顺序表
void Print(SqList* L){
for(int i=0;i<L->length;i++){
printf("%d ",L->data[i]);
}
printf("\n数组的长度:%d\n",L->length);
}
int main(){
SqList L;
InitList(&L);
IncreaseSize(&L,5);//如果这一没有的话,插入语句不合法。
if(ListInsert(&L,10,22)){
Print(&L);
}else{
printf("你插入的位置不正确,请重新插入\n");
}
int e =-1;//没有任何意义,仅是一个实参用的
if(ListDelete(&L,8,&e)){
printf("已经删除的元素为=%d\n",e);
}else{
printf("删除的位序不对,删除失败\n");
}
int num =GetElem(&L,4);
printf("位序为4的数是%d\n",num);
int Location = LocateElem(&L,6);
printf("数值为6的位置在%d\n",Location);
return 0;
}