自己手写一个线性表List【C风格】

cpp 复制代码
#include <iostream>

//线性表、顺序表List

#define MAX_SIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status;//返回状态类型
typedef int ElemType;//元素类型

//结构体
typedef struct 
{
    ElemType data[MAX_SIZE];//数据类型,数组
    int length;//长度
} myList;

//初始化
Status InitList(myList* list)
{
    //如果为空返回
    if (list == NULL)
        return ERROR;
    //不为空,设置为空
    list->length = 0;
    return OK;
}

//清空列表
Status ClearList(myList* list)
{
    //如果为空返回
    if (list == NULL)
        return ERROR;
    //不为空,设置为空
    list->length = 0;
    return OK;
}

//列表是否为空
Status ListIsEmpty(myList* list)
{
    //列表不存在,就是空
    if (list == NULL)
        return TRUE;
    //长度为0,为空
    if (list->length == 0)
        return TRUE;
    //否则就非空
    return FALSE;
}

//获取列表长度
Status ListLength(myList* list)
{
    return list->length;
}

//插入数据
Status ListInsert(myList* list,int index,const ElemType e)
{
    //如果列表为空
    if ((list->length == 0)&&(index == 1))
    {
        list->data[0] = e;
        list->length++;
        return OK;
    }

    //如果列表不为空
    if ((index <= list->length) && (index >= 1) && (list->length < MAX_SIZE))
    {
        for (int i = list->length - 1; i >= index - 1; i--)
        {
            list->data[i + 1] = list->data[i];
        }
        list->data[index - 1] = e;
        list->length++;
        return OK;
    }
    return ERROR;
}

//删除数据
Status ListDelete(myList* list, int index)
{
    //删除中间的元素
    if ((index < list->length) && (index > 0) )
    {
        for (int i = index; i < list->length; i++)
        {
            list->data[i-1] = list->data[i];
        }
        list->length--;
        return OK;
    }

    //删除末尾的元素
    if ((index == list->length) && (index > 0))
    {
        list->length--;
        return OK;
    }
    return ERROR;
}

//遍历元素
Status ListTraverse(myList* list)
{
    for (int i = 0; i < list->length; i++)
    {
        printf("%d-->",list->data[i]);
    }
    printf("\r\n");
    return OK;
}

//访问元素
Status GetElem(myList* list, int index, ElemType* e)
{
    if ((index > 0) && (index < list->length) && (list->length > 0))
    {
        *e = list->data[index - 1];
        return OK;
    }
    return ERROR;
}

int main()
{
    myList list;
    ElemType e;
    Status res;
    int i, j;
    res = InitList(&list);
    printf("初始化后:length = %d\n", list.length);

    //插入元素
    for (i = 0; i < 6; i++)
    {
        res = ListInsert(&list, 1, i);
    }
    ListTraverse(&list);//显示元素

    res = ListIsEmpty(&list);
    printf("list 是否为空?%d(1: 是,0: 否)\n", res);
    ClearList(&list);

    res = ListIsEmpty(&list);
    printf("list 是否为空?%d(1: 是,0: 否)\n", res);

    for (i = 0; i < 11; i++)
    {
        res = ListInsert(&list, 1, i);
    }
    ListTraverse(&list);//显示元素

    ListInsert(&list, 1, 0);
    ListTraverse(&list);//显示元素

    GetElem(&list, 5, &e);
    printf("第5元素是%d\n", e);

    j = list.length;
    res =  ListDelete(&list, j+1);
    if (res == ERROR)
        printf("删除第%d元素失败!\n", j + 1);
    else
        printf("删除第%d元素成功!\n", j);

    res = ListDelete(&list, j);
    if (res == ERROR)
        printf("删除第%d元素失败!\n", j);
    else
        printf("删除第%d元素成功!\n", j);

    ListTraverse(&list);//显示元素

    res = ListDelete(&list, 5);
    if(res == OK)printf("删除第%d元素成功!\n", 5);
    ListTraverse(&list);//显示元素

    return 0;
}
相关推荐
weixin_456808384 小时前
【沁恒蓝牙开发】拓展广播 Code PHY-从机
c语言·嵌入式硬件
de_wizard4 小时前
DeepSeek API 调用 - Spring Boot 实现
windows·spring boot·后端
小学鸡!4 小时前
win10/win11下载安装Docker,Windows安装Docker Desktop 【保姆级教程】
windows·docker·容器
夜星辰20234 小时前
在 Ubuntu 里创建 Docker 容器,与在 Windows 上安装 VMware Workstation Pro 虚拟机的区别
windows·ubuntu·docker
DowneyJoy4 小时前
【Unity3D补充知识点】常用数据结构分析-集合(List<T>)
数据结构·unity·c#·list
计算机安禾5 小时前
【数据结构与算法】第16篇:串(String)的定长顺序存储与朴素模式匹配
c语言·数据结构·c++·学习·算法·visual studio code·visual studio
姜太小白5 小时前
【其他】QEMU 在 Windows 和 CentOS 7 下安装及运行 ARM 操作系统指南
arm开发·windows·centos
AI科技星5 小时前
基于v≡c公设的理论优化方案
c语言·开发语言·算法·机器学习·数据挖掘
自然常数e5 小时前
预处理讲解
java·linux·c语言·前端·visual studio
jllllyuz5 小时前
小型物联网系统——家居网关设计(C语言实现)
c语言·物联网·struts