自己编写顺序表函数库详解

头文件

#ifndef _ARRAYLIST_H
#define _ARRAYLIST_H

#define SIZE 10

#define SUCCESS 10000
#define FAILURE 10001
#define TRUE    10002
#define FALSE   10003

typedef int ElemType;  //为已有的数据类型取一个新名字

//定义一个数据类型,该数据类型的名字叫struct SequenceList,该数据类型含有两个成员变量,分别是data, length;
struct SequenceList
{
  int length;
  ElemType *data;
};

typedef struct SequenceList SeLi;

int SequenceInit(SeLi *l);  //分号不能省
int SequenceInsert(SeLi *l, int p, ElemType e);
int SequenceDelete(SeLi *l, int p, ElemType *e);
int LocateElem(SeLi l, ElemType e);
int GetElem(SeLi l, int p, ElemType *e);
int SequenceLength(SeLi l);
int SequenceEmpty(SeLi l);
int SequenceTraverse(SeLi l, void(*p)(ElemType));
int SequenceClear(SeLi *l);
int SequenceDestroy(SeLi *l);

#endif

库函数   

    写类库:

      1、初始化条件

      2、各个参数的含义

      3、函数操作完达到的功能

#include "ArrayList.h"
#include <stdlib.h> //还包含了exit函数

//初始化条件:结构体已存在,且被传入函数
//SeLi *l l是一个指针,指针的数据类型SeLi *,指针指向的类型是SeLi 
//函数功能:构建一个空的顺序表,为顺序表分配一个空间,顺序表的长度为0
int SequenceInit(SeLi *l)
{
    if (NULL == l)      //入参判断
    {
        return FAILURE;
    }

    l->length = 0; //l这个指针变量指向的结构体的length成员变量
    l->data = (ElemType *)malloc(sizeof(ElemType) * SIZE);//动态内存分配失败

    return SUCCESS;
}

//初始化条件:结构体已存在,且被传入函数,并且顺序表已经建立
//SeLi *l l是一个指针,指针的数据类型是SeLi *,指针指向的类型是SeLi
//p是要插入的位置
//e是要插入的元素
//函数功能:在线性表中的第p个位置插入新元素e
//★注意数组下标和要插入位置p之间有差1的关系
int SequenceInsert(SeLi *l, int p, ElemType e) //p的值从1开始
{
    int i;

    //当结构体未被传入函数,或者顺序表并未被分配空间时,不能插入
    if (NULL == l || NULL == l->data) 
    {
        return FAILURE;
    }

    //如果线性表长度为3,要往第5个位置插入,或者顺序表的长度等于容量,或者插入位置小于1时,插入失败
    if (p > l->length + 1 || l->length >= SIZE || p < 1)
    {
        return FAILURE;
    }

    //从第P个位置开始,将所有元素向后移一个位置
    for (i = 0; i < l->length - p + 1; i++)
    {
        l->data[l->length - i] = l->data[l->length - i - 1]; 
    }

    l->data[p - 1] = e;     //要插入的元素赋给第p-1个元素
    l->length++;            //顺序表长度加1

    return SUCCESS;
}

//初始化条件 结构体存在且被传入函数
//SeLi *l l是一个指针,指针的数据类型是SeLi *,指针指向的类型是SeLi
//p是要删除的元素的位置
//ElemType *e e是要被赋值的元素
//函数功能:删除顺序表中第p个位置的元素,并且用e返回其值
int SequenceDelete(SeLi *l, int p, ElemType *e)
{
    int i;

    if (NULL == l)              //入参判断
    {
        return FAILURE;
    }

    if (p < 1 || p > l->length) //判断要删除的位置是否合法 
    {
        return FAILURE;
    }

    *e = l->data[p - 1];        //将欲删除的元素保留在e中 

    for (i = 0; i < l->length - p; i++)//将第p+1至第l->length位的元素依次向前移动一个位置 
    {
        l->data[p + i - 1] = l->data[p + i];
    }

    l->length--;
                                //表长减一,删除成功返回SUCCESS 
    return SUCCESS;
}

//初始化条件:结构体被传入函数
//SeLi l: l是一个结构体
//函数功能:返回结构体成员length的值,即顺序表的长度
int SequenceLength(SeLi l)
{
    return l.length;
}

//初始化条件:结构体被传入函数
//SeLi l: l是一个结构体
//函数功能:如果顺序表为空,返回TRUE,否则返回FALSE.
int SequenceEmpty(SeLi l)
{
    return (0 == l.length) ? TRUE : FALSE;
}

//初始条件:顺序表已存在
//SeLi l:传入顺序表 
//void(*p)(ElemType):函数指针,指向输出函数
//函数功能:挨个打印顺序表的值
int SequenceTraverse(SeLi l, void(*p)(ElemType))
{
    int i;

    if (NULL == p)                  //入参判断
    {
        return FAILURE;
    }

    for (i = 0; i < l.length; i++) //挨个打印顺序表的值
    {
        p(l.data[i]);
    }

    return SUCCESS;
}

//初始化条件:位置p不小于1或者不大于顺序表的长度
//SeLi l:l是一个结构体
//p是要查看的位置
//ElemType *e是要被赋值的数
//函数功能:将顺序表中第p个位置的元素赋给e
int GetElem(SeLi l, int p, ElemType *e)
{
    //如要要查看的位置小于1,或者大于顺序表的长度,查看失败
    if (p < 1 || p > l.length)  
    {
        return FAILURE;
    }
    
    *e = l.data[p - 1]; //将要查看的位置的值赋给e,(下标和位置差1的关系)

    return SUCCESS;
}

//初始化条件:结构体被传入函数
//SeLi l:l是一个结构体
//e是要查找的元素
//函数功能:在顺序表中查找与给定值e相等的元素,如果找得到,返回位置
int LocateElem(SeLi l, ElemType e)
{
    int i;

    for (i = 0; i < l.length; i++)
    {
        if (e == l.data[i])
        {
            return i + 1;
        }
    }

    return FAILURE;
}

//初始化条件:函数已经存在,且被传入函数
//SeLi *l l是一个指针,指针的数据类型是SeLi *,指针指向的类型是SeLi
//函数功能:清空顺序表
int SequenceListClear(SeLi *l)
{
    if (NULL == l)          //入参判断
    {
        return FAILURE;
    }

    l->length = 0;          //空线性表的长度为0

    return SUCCESS;
}

//初始化条件:结构体已存在,且被传入函数
//SeLi *l l是一个指针,指针的数据类型是SeLi *,指针指向的类型是SeLi
//函数功能:销毁顺序表
//★★记得把指向顺序表的指针变为空指针,光释放会成为野指针
int SequenceListDestroy(SeLi *l)
{
    if (NULL == l)      //入参判断
    {
        return FAILURE;
    }

    l->length = 0;      //先清空顺序表
    free(l->data);      //释放为顺序表分配的空间
    l->data = NULL;     //指针变为空指针

    return SUCCESS;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值