自己手写一个线性表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;
}
相关推荐
心仪久了会沦陷34 分钟前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
xbzb2 小时前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
武雄(小星Ai)3 小时前
Ollama报llama-server binary not found排坑实录:服务活着引擎没了
人工智能·windows·大模型·ollama·排坑
Severus_black4 小时前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
希和20278 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
叼烟扛炮17 小时前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
Zwawa1 天前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式
Fruiticecake1 天前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++
田甲1 天前
做一款 Type-C 母座读卡器:GL3224 双卡方案实测
c语言·开发语言
·present·1 天前
CSAPP(lecture 13_02 Linking)
c语言·c++