顺序表----12个基本操作实现

顺序表是指线性表的顺序表示,指的是用一组地址连续的存储单元依次存储线性表的数据元素。只要确定了顺序表的起始位置,顺序表的任一数据元素都可以随机存取,线性表的顺序存储结构是一种随机存取的存储结构。在这点上与高级程序设计语言中的数组十分相似,因此通常用数组来描述数据结构中的顺序存储结构。

接下来是顺序表的12个基本操作和这12个操作在主函数中的检验。

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<stdio.h> 
#define TRUE   1
#define FALSE  0    
#define OK     1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW   -2
typedef  int   Status;
typedef  int ElemType;

#define LIST_INIT_SIZE 100
#define LISTINCREMENT   10
typedef struct
{
    ElemType  *elem;
    int      length;
    int    listsize;
}SqList;

//1.构造顺序表
Status InitList(SqList &L)
{
    L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if (!L.elem)
        return ERROR;
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK;
}

//2.销毁顺序表
Status DestroyList(SqList &L)
{
    if (L.elem)
        free(L.elem);
    if (L.elem == NULL)
        return OK;
    else
        return ERROR;
}
//3.清空顺序表
void ClearList(SqList &L)
{
    L.length = 0;
}
//4.判断顺序表是否空表
Status ListEmpty(SqList L)
{
    if (L.length == 0)
        return ERROR;
    else
        return OK;
}
//5.顺序表求表长
Status ListLength(SqList L)
{
    return L.length;
}
//6.顺序表的取元素
Status GetElem(SqList L)
{
    int i, e;    //取出顺序表中第i个元素e
    printf("请输入要取的元素的位序:\n");
    scanf("%d",&i);
    if (i<1 || i>L.length)
        return ERROR;
    else
        e = L.elem[i - 1];
    printf("要取出的第%d个元素是%d\n",i,e);
    return OK;
}
//辅助函数
Status compare(int e1, int e2)
{
    if (e1 == e2)
        return OK;
    else
        return ERROR;
}

//7.顺序表的定位
Status LocateElem(SqList L)
{
    int e, i = 1;
    printf("请输入要定位的元素:\n");
    scanf("%d",&e);
    while (i <= L.length&&L.elem[i - 1] != e)
    {
        i++;
    }
    if (i > L.length)
        return ERROR;
    else
        printf("要定位的元素的位序为%d\n",i);
        return i;
}

//8.返回前驱
Status PriorElem(SqList L)
{
    int cur_e, pre_e, i = 1;
    int *p;
    p = L.elem + 1;//将第二个元素的地址赋值给p
    printf("请输入顺序表中第二到表尾的任何一个数:\n");
    scanf("%d",&cur_e);
    while(i < L.length && compare(cur_e, L.elem[i - 1]))
    {
        p++;
        i++;
    }
    if (i > L.length)
        return ERROR;
    else
    {
        pre_e = L.elem[i];  //注意i
        printf("它的前驱元素是%d\n",pre_e);
        return pre_e;//将此元素返回给要调用的函数
    }        
}
//9.返回后继
Status NextElem(SqList L)
{
    int cur_e, next_e, i = 0;//i的初值是第一个元素的位序
    printf("请输入第一到倒数第二个任意一个元素:\n");
    scanf("%d",&cur_e);
    int *p = L.elem;//第一个元素的地址赋值给p
    while (i < L.length && !compare(cur_e, L.elem[i]))
    {
        p++;
        i++;
    }
    if (i == L.length)
    {
        return ERROR;
    }
    else
    {
        next_e = *(++p);
        printf("它的后继元素是%d\n",next_e);
        return next_e;//将此元素返回给主函数
    }
}
//10.插入元素
Status ListInsert(SqList &L)
{
    ElemType *p, *q, *newbase;
    int i, e;//在位置i插入元素e
    printf("请输入要插入的元素的位置i:\n");
    scanf("%d",&i);
    printf("请输入要插入的元素的数值e:\n");
    scanf("%d",&e);
    if (i<1 || i>L.length)
        return ERROR;
    if(L.length>=L.listsize)
    {
        if (!(newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
            exit(0);//分配存储空间失败
        L.elem = newbase;//新基址
        L.listsize += LISTINCREMENT;//增加存储容量
    }
    q = L.elem + i - 1;//q为插入位置
    for (p = L.elem + L.length - 1; p >= q; --p)
    {
        *(p + 1) = *p;//给插入位置之后的元素赋值达到之后元素后移一位的效果
    }
    *q = e;//插入e
    ++L.length;
    return OK;
}
//11.删除元素
Status ListDelete(SqList &L)
{
    int i,e;
    printf("请输入要删除的元素的位置i:\n");
    scanf("%d",&i);
    if (i<1 || i>L.length)//i值不合法
        return ERROR;
    ElemType *p, *q;
    p = L.elem + i - 1;//p为被删除元素的位置
    e = *p;            //被删除元素的值赋给e
    printf("被删除的元素是%d\n",e);
    q = L.elem + L.length - 1;//q是表尾元素的位置
    p = p + 1;
    for ( ; p <= q; p++)
        *(p - 1) = *p;
    L.length--;  //表长减一
    return OK;
}
//12.遍历
Status ListTraverse(SqList L)
{
    ElemType *p = L.elem;
    int i;
    for (i = 1; i <= L.length; i++)
        printf("%d ",*p++);
    printf("\n");
    return OK;
}
int main()
{
    int m,n;
    SqList L;
    InitList(L);
    printf("……顺序表初始化……\n");
    printf("请输入顺序表的长度n:\n");
    scanf("%d",&n);
    for (m = 1; m <= n; m++)
    {
        printf("请输入第%d个元素的值:\n",m);
        scanf("%d",&L.elem[m-1]);
        L.length++;
    }
    printf("顺序表的长度为%d\n",L.length);
    printf("顺序表中的元素为:\n");
    ListTraverse(L);
    printf("…………判断顺序表是否空表…………\n");
    if (ListEmpty(L) == 1)
        printf("顺序表非空\n");
    else
        printf("顺序表为空\n");
    printf("…………顺序表中取元素操作…………\n");
    GetElem(L);
    printf("…………顺序表中元素的定位…………\n");
    LocateElem(L);
    printf("…………顺序表中元素的前驱…………\n");
    PriorElem(L);
    printf("…………顺序表中元素的后继…………\n");
    NextElem(L);
    printf("…………顺序表元素插入测试…………\n");
    ListInsert(L);
    printf("此时顺序表中的元素为:\n");
    ListTraverse(L);
    printf("…………顺序表元素删除测试…………\n");
    ListDelete(L);
    printf("此时顺序表中的元素为:\n");
    ListTraverse(L);
    printf("恭喜您成功完成顺序表的所有功能!!!!\n");
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值