#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100 //静态顺序表的默认长度
typedef int DateType;
//定义结构体(相当于Java类) ,
typedef struct {
DateType data[MaxSize];//自定义类型数组,默认长度为MaxSize 100
int length;
}SeqList;
//初始化顺序表中的数据,默认有效长度为0
void InitList(SeqList * L){
L->length = 0;
//默认初始值,防止内存有脏数据
for(int i=0;i<MaxSize;i++){
L->data[i] = 0;
}
printf("初始化顺序表成功!\n");
}
//以数组的形式作为参数传入,并初始化到结构体数组中
int CreateList(SeqList * L,DateType a[],int n){
//参数数组的长度不能大于默认结构体数组的长度MaxSize,
//此处可以实现动态扩容,即是在做插入操作时就要判断结构体数组是否满,满则主要扩容
if(n>MaxSize){
printf("顺序表的空间不够,无法建立顺序表\n");
return 0;
}
// 将数组中的元素复制到列表中,n是参数数组的长度
for(int i=0;i<=n-1;i++){
L->data[i] = a[i];
}
L->length = n;
printf("创建线性表成功!\n");
return 1;
}
//判断结构体数组是否为空
int isEmpty(SeqList * L){
if(L->length == 0){
return 1;
}else{
printf("该顺序表不为空!");
return -1;
}
}
//返回结构体数组实际长度
int Length(SeqList * L){
return L->length;
}
//遍历结构体数组中的有效数据
void foreach(SeqList * L){
printf("列表中的数据有:");
for(int i=0;i<=L->length-1;i++){
printf("%d ",L->data[i]);
}
printf("\n");
}
//按值查找
DateType searchByValue(SeqList * L,DateType value) {
for(int i=0;i<=L->length-1;i++){
if( L ->data[i] == value){
return L->data[i];
break;
}
}
printf("类表中没有该元素!");
return -1;
}
//按索引index查找,使用指针带回当前索引数据
void indexOf(SeqList * L,int index,DateType * ptr){
if(index >= L ->length || index < 0){
printf("索引不合法,查找失败!");
}else
* ptr = L->data[index];
}
//插入数据,index是位序,不是索引,索引从零开始
bool insert(SeqList * L,int index,DateType value){
//判断该位序是否合法 位序大于0小于结构体数组的有效长度length
if(index >L->length||index<1){
//TODO
printf("插入位置非法禁止插入!");
return false;
}
//要插入元素前必须先实现,指定索引index-1后的元素都向后移动一位
//插入先从后移动,删除从从当前索引移动
for(int i=L->length;i>=index;i--){
//TODO
L->data[i] = L->data[i-1];
}
L->data[index-1] = value;
L->length++;
return true;
}
bool deleteByValue(SeqList * L,DateType value){
//根据值找到元素得到索引坐标
int temp=-1;
for(int i = 0;i<L->length;i++){
if(L->data[i]==value){
temp = i;
break;
}
}
//将当前索引之后的元素向前移动一位
if(temp != -1){
for(int i=temp;i<=L->length-1;i++){
L->data[i] = L->data[i+1];
}
L->length--;
}
return true;
}
//判断当前结构体数组是否需要扩容
bool isExCapciaty(SeqList * L,int length){
// 结构体数组的有效长度大于默认长度就扩容
if(L->length>MaxSize){
return true;
}
return false;
}
//扩容操作
void ExCapacity(SeqList * L){
//创建一个新的 DateType数组,是原来的1.5倍
DateType newArray[MaxSize+MaxSize>>1];
//将原来的数据进行拷贝
for(int i = 0 ;i <L->length;i++){
newArray[i]=L->data[i];
}
//将结构体的原数组,指向新数组(我是学Java的这里至于怎么实现的语法忘记了)
// 需要的小伙伴自己实现哦
// ……
}
int main(){
int r[5] = {1,2,3,4,5};
int i;
SeqList L;
//初始化顺序表默认长度为0
InitList(&L);
//创建线性表
CreateList(&L,r,5);
foreach(&L);
//插入 在第三个位置插入88 期望结果:1,2,88,3,4,5
if(insert(&L,3,88)){
printf("插入数据成功!\n");
};
//遍历
foreach(&L);
printf("线性表当前长度为:%d\n",Length(&L));
//在顺序表中查询值为11的元素
printf("%d\n",searchByValue(&L,11));
//查找元素索引为2的值
indexOf(&L,2,&i);
printf("索引为2的值为:%d\n",i);
//删除元素的值
if( deleteByValue(&L,88)){
printf("删除成功!\n");
foreach(&L);
}
printf("%d",isEmpty(&L) );
}
记录一下自己的数据结构学习打卡,实现了顺序表的基本操作增删改查,由于在大一时第一次接触代码,不熟悉数据结构也学得马马虎虎,现在重新学习。加油!