顺序表实现简单交互(C语言)

用数据结构中顺序表实现一组数据的存储,并通过简单的交互实现该顺序表的增删改查。

//ADT 线性表(List) 顺序存储结构
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType; //ElemTYpe类型根据实际情况而定。
typedef int Status;   //Status是函数的返回值类型,其值是函数结果状态代码,如OK等。
//定义一个顺序表
typedef struct
{
    ElemType data[MAXSIZE];
    int length;
} SqList;

//顺序表的初始化
Status InitList(SqList *L)
{
    L->length = 0;
    return OK;
}

//判断顺序表是否初始化成功
Status ListEmpty(SqList L)
{
    if (L.length == 0)
        return TRUE;
    else
        return FALSE;
}

//将顺序表清空
Status ClearList(SqList *L)
{
    L->length = 0;
    return OK;
}

//查询顺序表的数据元素个数
Status ListLength(SqList L)
{
    return L.length;
}

//关于顺序表的增删改查操作
//顺序表的取值,用*e将顺序表i位置的数据元素的值取出。
Status GetElem(SqList L, int i, ElemType *e)
{
    if (L.length == 0 || i < 1 || i > L.length)
        return ERROR;
    *e = L.data[i - 1];
    return OK;
}

//顺序表的查询,查询顺序表中数据元素的值为e的位置i。
Status LocateElem(SqList L, int i, int e)
{
    if (L.length == 0)
        return FALSE;
    for (i = 0; i < L.length; i++)
    {
        if (L.data[i] == e)
        {
            i = i + 1;
            break;
        }
        if (i >= L.length)
            return ERROR;
    }
    return i;
}

//顺序表的插入,将值为e的数据元素插入位置i之前。
Status ListInsert(SqList *L, int i, int e)
{
    int k;
    if (L->length == MAXSIZE)
        return FALSE;
    if (i < 1 || i > L->length + 1)
        return ERROR;
    if (i <= L->length)
    {
        for (k = L->length - 1; k >= i - 1; k--)
        {
            L->data[k + 1] = L->data[k];
        }
    }
    L->data[i - 1] = e;
    L->length++;
    return OK;
}

//顺序表的删除,将顺序表位置为i的数据元素删除,并用*e返回其值。
Status ListDelete(SqList *L, int i, ElemType *e)
{
    int k;
    if (L->length == 0)
        return FALSE;
    if (i < 1 || i > L->length)
        return ERROR;
    *e = L->data[i - 1];
    if (i < L->length)
    {
        for (k = i; k < L->length; k++)
        {
            L->data[k - 1] = L->data[k];
        }
    }
    L->length--;
    return OK;
}

//顺序表主函数
int main()
{
    SqList L;
    ElemType e;
    Status i;
    printf("顺序表自动初始化中......\n");
    i = InitList(&L); //初始化顺序表
    i = ListEmpty(L); //判断顺序表是否初始化成功
    if (i == 1)
        printf("顺序表初始化成功,顺序表长度为%d\n", L.length); //输出初始化结果
    else
        printf("顺序表初始化失败\n");
    printf("请输入整型数据:");
    for (i = 0; TRUE; i++)
    {
        scanf("%d", &L.data[i]);
        L.length++;
        char c = getchar(); //通过getchar函数读取输入缓冲区的空格和回车,实现输入回车时结束数据的输入。
        if (c == '\n')
            break;
    }
    printf("数据存储成功,顺序表长度为%d\n", L.length);
    while (TRUE) //该循环意在实现交互性。
    {
        int a;
        printf("请选择要进行的操作:\n1:查询顺序表数据元素个数\n2:取出相应位序数据元素的值\n3:查询数据元素的值的相应位置\n4:数据元素的插入\n5:数据元素的删除\n6:清空顺序表并结束程序\n");
        scanf("%d", &a);
        switch (a)
        {
        case 1:
        {
            int b;
            b = ListLength(L);
            printf("顺序表数据元素个数为%d\n", b);
            break;
        }
        case 2:
        {
            int b;
            printf("请输入将要取值的位序:");
            scanf("%d", &i);
            b = GetElem(L, i, &e);
            if (b == 0)
                printf("将要取值的位序不正确\n");
            else
                printf("取值成功,值为%d\n", e);
            break;
        }
        case 3:
        {
            int b;
            printf("请输入将要查询的值:");
            scanf("%d", &e);
            b = LocateElem(L, i, e);
            if (b == 0)
                printf("将要查询的值不在顺序表中\n");
            else
                printf("查询成功,位序为:%d\n", b);
            break;
        }
        case 4:
        {
            int b;
            printf("请输入将要插入的值:");
            scanf("%d", &e);
            printf("请输入将要插入的位序:");
            scanf("%d", &i);
            b = ListInsert(&L, i, e);
            if (b == 0)
                printf("插入失败\n");
            else
                printf("插入成功\n");
            break;
        }
        case 5:
        {
            int b;
            printf("请输入将要删除的位序:\n");
            scanf("%d", &i);
            b = ListDelete(&L, i, &e);
            if (b == 0)
                printf("删除失败\n");
            else
                printf("删除成功,删除的值为%d\n", e);
            break;
        }
        case 6:
        {
            int b;
            b = ClearList(&L);
            if (b == 0)
                printf("顺序表清空失败\n");
            else
                printf("顺序表清空成功\n");
            exit(0);
        }
        default:
            break;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值