【数据结构】顺序存储结构

注意定义的函数的顺序,后面调用前面 不能前面调用后面

/*顺序存储结构*/
#include <stdio.h>
#include <stdlib.h> //pause 的头文件
#include <time.h> // 使用当前时钟做种子

#define OK    1
#define ERROR 0
#define TRUE  1
#define FALSE 0
#define MAXSIZE 20 //存储空间最大分配量
#define LIST_INITSIZE 5 
typedef int Status;//Status 是函数的类型,其值是函数结果状态代码 如OK
typedef int ElemType;//ElemType类型根据实际情况定


/*顺序存储结构*/
/**
顺序存储结构的三个属性
1. 存储空间的起始位置:数组data,其存储位置就是存储空间的存储位置
2. 线性表的最大存储容量 数组长度MaxSize
3. 线性表当前长度 length
*/
typedef struct Node
{
    ElemType data[MAXSIZE];//数组存储数据元素,最大值为MAXSIZE
    int length;//线性表当前长度
}SqList; //别名


/*初始化*/
Status InitList_Sq(SqList *L)
{
    int k;
    // 初始化随机化函数
    srand((unsigned)time(NULL));
    L->length = LIST_INITSIZE;
    for(k=0;k<L->length;k++)
    {
        L->data[k] = rand();
    }
    return OK;
}

/**
 初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
 操作结果:用e返回L中第i个数据元素的值
*/


/*获取第i个元素*/
Status GetElem(SqList L,int i,ElemType *e)
{
    // 判断i是否越界
    if(L.length==0||i<1||i>L.length)
    {
        return ERROR;
    }
    *e = L.data[i-1];
    printf("第%d个元素的值为%d\n\n",i,*e);
    return OK;
}

/**
 插入操作
 1. 插入位置的合理性
 2. 数组容量是否充足(抛出异常/增加容量)
 3. 元素插入
 4. length++
*/
Status ListInsert(SqList *L,int i, ElemType e)
{
    int k;//用于向后推移的位置变量
    // 判断是否越界
    if(L->length>=MAXSIZE||i<1||i>L->length+1)
    {
        return ERROR;
    }
    if (i!=L->length)
    {
        // 将第i个元素及其之后的元素向后移动一位
        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;
}

/**
 删除元素
 1. 判断删除位置的合理性
 2. 取出删除元素
 3. 移动元素
 4. 表长--
 */
Status ListDelete(SqList *L,int i,ElemType *e)
{
    int k;
    if (L->length==0||i<1||i>L->length)
    {
        return ERROR;
    }
    *e = L->data[i-1];
    // 删除后前移一位
    if (i!=L->length)
    {
        for(k=i-1;k<L->length-1;k++)
        {
            L->data[k]=L->data[k+1];
        }
    }
    L->length--;
    return OK;
}

/*输出*/
void PrintList(SqList L)
{
    int i; // 用于循环遍历
    printf("开始输出\n");
    for (i = 0; i < L.length; i++)
    {
        printf("%d ",L.data[i]);
    }
    printf("\n输出结束\n\n");
}
void main(void){
    SqList L;
    int k;// 用于循环遍历
    ElemType *e;
    e = (ElemType *)malloc(sizeof(ElemType));
    // 初始化
    InitList_Sq(&L);
    //输出测试
    PrintList(L);
    // 获取测试
    GetElem(L,5,e);
    // 插入测试
    ListInsert(&L,6,32);
    ListInsert(&L,7,7);
    PrintList(L);

    // 删除测试
    ListDelete(&L,5,e);
    PrintList(L);
    system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值