线性表的顺序存储结构

顺序存储线性表的结构体:

#define MAXSIZE 100        //数组最大长度
typedef int ElemType;        //元素类型

typedef struct            //定义线性表结构体
{
    ElemType date[MAXSIZE];        //线性表存储元素的数组
    int length;                    //记录线性表的长度
}sqList;                        //线性表的名称

顺序存储的插入函数:

/*
线性表的插入函数
*p  指向线性表的指针
i   需要插入的位置
e   将要插入的元素
Status未返回值类型,在头文件处定义,格式为:typedef int Status;        //返回值类型,操作成功返回1(OK),失败返回0(ERROR)
*/ Status ListInsert(sqList *p, int i, ElemType e) { if(p->length == MAXSIZE) //如果表长度已经等于最大值,则表已满,返回ERROR return ERROR; if(i < 1 || i > p->length + 1) //如果i<1或i>表长+1,则位置有误,返回ERROR return ERROR; if(i <= p->length) //判断i是不是表尾位置 { for(int k = p->length; k >= i - 1; k--) //将表中i之后的元素全部后移一个位置 p->date[k+1] = p->date[k]; } p->date[i-1] = e; //将第i个位置的元素赋值为e p->length++; //将表长+1 return OK; //操作成功,返回OK }

顺序存储的删除函数:

/*
线性表的删除操作函数
*p  指向线性表的指针
i   需要删除的位置
*e  将删除的元素存入*e中返回
*/
Status ListDel(sqList *p, int i, ElemType *e)
{
    if(p->length == 0)        //判断线性表是否为空
        return ERROR;
    if(i < 1 || i > p->length)        //判断i的位置是否合理
        return ERROR;
    *e = p->date[i-1];        //将表中第i个元素的值赋值给*e
    printf("删除的元素为 %d\n", *e);
    if(i <= p->length)        //判断i是不是表尾元素
    {
        for(int k = i-1; k <= p->length; k++)    //将表中i后的元素全部向前移一位
            p->date[k] = p->date[k+1];
    }
    p->length--;        //将表长-1
    return OK;            //操作成功返回OK
}

顺序存储的索引查找函数:

/*
线性表的查询操作
p  表的形参
i  需要得到的位置
*e 将所查位置的元素赋值给*e返回
*/
Status GetElem(sqList p, int i, ElemType *e)
{
    if(p.length == 0 || i < 1 || i > p.length)        //判断表是否为空,i位置是否合理
        return ERROR;
    *e = p.date[i-1];        //将表的第i个元素赋值给*e
    printf("此处的元素为 %d\n", *e);
    return OK;                //操作成功返回OK
}

顺序存储的修改函数:

/*
修改表中i位置的元素内容
*/
Status UpdateList(sqList *p, int i, ElemType e)
{
    if(p->length == 0 || i < 1 || i > p->length)
        return ERROR;
    p->date[i-1] = e;
    return OK;
}

顺序存储的遍历打印函数:

/*
遍历打印表中元素
*/
Status PrintList(sqList p)
{
    int i = 0;
    if(p.length == 0)
        return ERROR;
    while(i < p.length)
    {
        printf("%d ", p.date[i]);
        i++;
    }
    printf("\n");
    return OK;
}

主函数:

void main()
{
    sqList list;        //声明线性表的变量
    list.length = 0;    //设置表长为0,相当于初始化
    int i, e;            //i为元素位置,e为元素内容

    while(true)
    {
        printf("请选择对线性表的操作:\n");
        printf("1.插入\n");
        printf("2.删除\n");
        printf("3.查找\n");
        printf("4.输出\n");
        printf("5.修改\n");
        printf("6.退出\n");
        int a;
        scanf("%d", &a);
        switch(a)
        {
            case 1:
                printf("请输入需要插入的位置:");
                scanf("%d", &i);
                printf("请输入需要插入的元素:");
                scanf("%d", &e);
                if(ListInsert(&list, i, e))
                    printf("插入成功\n");
                else
                    printf("插入失败\n");
                break;
            case 2:
                printf("请输入需要删除的位置:");
                scanf("%d", &i);
                if(ListDel(&list, i, &e))
                    printf("删除成功\n");
                else
                    printf("删除失败\n");
                break;
            case 3:
                printf("请输入需要查找的位置:");
                scanf("%d", &i);
                if(GetElem(list, i, &e))
                    printf("查询成功\n");
                else
                    printf("查询失败\n");
                break;
            case 4:
                PrintList(list);
                break;
            case 5:
                printf("请输入需要修改的位置:");
                scanf("%d", &i);
                printf("请输入新的的元素:");
                scanf("%d", &e);
                if(UpdateList(&list, i, e))
                    printf("修改成功\n");
                else
                    printf("修改失败\n");
                break;
            case 6:
                return;
            default:
                printf("选择错误\n");
                break;
        }
    }
}

经检测,所有代码均可执行!

猜你喜欢

转载自www.cnblogs.com/yurui/p/9498767.html