自己手写一个线性表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;
}
相关推荐
森G10 分钟前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
weixin_395448911 小时前
mult_yolov5_post_copy.c_cursor_0205
c语言·python·yolo
梦帮科技1 小时前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json
Z9fish1 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
晓13132 小时前
第六章 【C语言篇:结构体&位运算】 结构体、位运算全面解析
c语言·算法
Lois_Luo2 小时前
关闭Win10强制所有应用以管理员身份运行
windows
梵刹古音2 小时前
【C语言】 指针与数据结构操作
c语言·数据结构·算法
刘琦沛在进步2 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
luoyayun3613 小时前
实现Windows系统标题栏颜色跟随主题动态切换
windows·系统标题栏颜色·标题栏颜色
猫头虎3 小时前
如何解决 OpenClaw “Pairing required” 报错:两种官方解决方案详解
网络·windows·网络协议·macos·智能路由器·pip·scipy