数据结构(c语言版) 顺序表

代码

c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef int E;     //这里我们的元素类型就用int为例吧,先起个别名

//定义结构体
struct List{
    E * array;
    int capacity;   //数组的容量
    int size;
};

//给结构体指针起别名
typedef struct List * ArrayList;    //因为是数组实现,所以就叫ArrayList,这里直接将List的指针起别名

//初始化
_Bool initList(ArrayList list){
    list->array = malloc(sizeof (E) * list->capacity);    //使用malloc函数申请10个int大小的内存空间,作为底层数组使用
    if(list->array == NULL) return 0;  //需要判断如果申请的结果为NULL的话表示内存空间申请失败
    list->capacity = 10;             //直接将数组的容量设定为10即可
    list->size=0;
    return 1;
}

//插入数据操作
_Bool insertList(ArrayList list, E element, int index){
    if(index < 1 || index > list->size + 1) return 0;                                    //判断插入位置,转换成位序,也就是[1, size + 1]这个闭区间

    if(list->size == list->capacity) {                                                   //如果size已经到达最大的容量了,肯定是插不进了,那么此时就需要扩容了
        int newCapacity = list->capacity + (list->capacity >> 1);                        //我们先计算一下新的容量大小,这里我取1.5倍原长度,当然你们也可以想扩多少扩多少
        E * newArray = realloc(list->array, newCapacity * sizeof(E));           //这里我们使用新的函数realloc重新申请更大的内存空间
        if(newArray == NULL) return 0;                                                   //如果申请失败,那么就确实没办法插入了,只能返回0表示插入失败了
        list->array = newArray;
        list->capacity = newCapacity;
    }

    for (int i = list->size; i > index - 1; --i)
        list->array[i] = list->array[i - 1];
    list->array[index - 1] = element;
    list->size++;
    return 1;
}

//打印数据
void printList(ArrayList list){   //编写一个函数用于打印表当前的数据
    for (int i = 0; i < list->size; ++i)   //表里面每个元素都拿出来打印一次
        printf("%d ", list->array[i]);
    printf("\n");
}

//删除操作
_Bool deleteList(ArrayList list, int index){
    if(index < 1 || index > list->size) return 0;
    for (int i = index - 1; i < list->size - 1; ++i)
        list->array[i] = list->array[i + 1];   //实际上只需要依次把后面的元素覆盖到前一个即可
    list->size--;   //最后别忘了size - 1
    return 1;
}

//获取size的大小
int sizeList(ArrayList list){
    return list->size;
}

//按位置获取元素
E * getList(ArrayList list, int index){
    if(index < 1 || index > list->size) return NULL;
    return &list->array[index - 1];
}

int findList(ArrayList list, E element){
    for (int i = 0; i < list->size; ++i) {   //一直遍历,如果找到那就返回位序
        if(list->array[i] == element) return i + 1;
    }
    return -1;  //如果遍历完了都没找到,那么就返回-1
}

int main(){
    struct List list;   //创建新的结构体变量
    if(initList(&list)){   //对其进行初始化,如果失败就直接结束
        for (int i =0; i<30; i++){
            insertList(&list, i*10, i+1);
        }
        deleteList(&list, 10);
        deleteList(&list, 10);
        printList(&list);
        printf("获取数组容量:%d\n", list.capacity);      //获取数组容量

        printf("按位置获取元素:%d\n", *getList(&list, 3));      //按位置获取元素
        printf("按值查找元素位置:%d\n", findList(&list, 30));  //按值查找元素位置
    } else{
        printf("顺序表初始化失败,无法启动程序!");
    }
}

运行效果

相关推荐
zyeyeye29 分钟前
C++入门:从HelloWorld到命名空间揭秘
c语言·开发语言·c++·算法
淡海水1 小时前
10-05-高级-模式匹配-CSharp如何改变与数据结构的交互方式
数据结构·算法·c#·模式匹配
蓝速科技2 小时前
蓝速科技 F100 双屏翻译机:中小企业跨国会议提效方案
大数据·网络·数据结构·人工智能·科技·运维开发
wuminyu2 小时前
Kafka配置TLS/SSL加密传输时零拷贝失效分析
java·linux·c语言·jvm·c++
keyipatience2 小时前
5种IO模型与阻塞IO,select,poll,epoll,LT和ET模式
linux·服务器·网络·数据结构·c++·算法
yanlaifan4 小时前
C语言标准版本简单介绍
c语言
彧azz11 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
wuyk55513 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
xx~t14 小时前
嵌入式——51单片机1
linux·c语言·单片机·嵌入式硬件·51单片机
Navigator_Z15 小时前
LeetCode //C - 1240. Tiling a Rectangle with the Fewest Squares
c语言·算法·leetcode