顺序表实现

SeqList.h

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;//假定线性表的元素类型为整型
#define LIST_SIZE 1024 //假定我们的线性表长度是1024
#define TRUE 1
#define FALSE 0
typedef struct {
    ElemType data[LIST_SIZE]; //数组形式表示顺序表
    int last;  //顺序表的长度,指向最后一个节点的位置,last的存在的目的:为了在函数调用的时候传递数据方便,因为我们与分配的空间中,并不是立即存满的
}SequenList;

///数组顺序表的实现初始化
///获得一个长度为0的数组
SequenList* InitSeq();


///求长度:求线性表中的元素的个数
///获得当前数组顺序表的元素个数,pList:顺序表的起始地址
int GetSizeSeq(SequenList* pList);

///取元素:取给定位置的元素值
///返回值是元素值
///pList:目标的顺序表, pos:获取元素的下标 ,e:将元素值放入
int GetElemSqList(SequenList* pList, int pos, ElemType *e);

///    查元素:查找给定元素值的位置
///相同值只去第一个
///返回值:-1表示没有找到,否则返回带查找元素的角标
///pList:传入的数组顺序表,Key比对的值
int LocateElemSqList(SequenList* pList, ElemType key);

///    插入元素:在指定的位置插入给定的值
/// 插入的位置为k:k: 0 -- n-1
//pList:目标顺序表,x待插入的元素,k插入的位置
int InsertElemSqList(SequenList* pList, ElemType x, int k);

///删除:删除指定位置的值或者是删除给定的值。
//pList:目标顺序数组,k表示需要删除的位置
int DelElemSqList(SequenList *pList, int k);

///遍历元素:从头到尾扫描线性表。
///pList:目标顺序数组
void showSeqList(SequenList* pList);

SeqLiist.c顺序表实现

#include "SeqList.h"
/*
1)    初始化:给线性表中的相关参数赋值
2)    求长度:求线性表中的元素的个数
3)    取元素:取给定位置的元素值
4)    查元素:查找给定元素值的位置
5)    插入元素:在指定的位置插入给定的值
6)    删除:删除指定位置的值或者是删除给定的值。
7)    遍历元素:从头到尾扫描线性表。

*/

SequenList* lPtr;

//实现初始化
SequenList* InitSeq() 
{
    SequenList *pList=NULL;
    pList = (SequenList *)malloc(sizeof(SequenList)); //分配了数组空间
    if (pList != NULL)
        pList->last = 0;//初始化成功,且长度为0

    return pList;
}


//SequenList seqenList;
//SequenList *seqenList;
//前者分配空间了,而后者没有空间


//求长度:求线性表中的元素的个数
int GetSizeSeq(SequenList* pList) {
    return pList->last;
}

//取元素:取给定位置的元素值
/// pList:目标的顺序表, pos:获取元素的下标 ,e:将元素值放入
int GetElemSqList(SequenList* pList, int pos, ElemType *e) {
    if (pos<0 || pos>pList->last) {
        return FALSE;
    }
    if (pList->last <= 0)
        return FALSE;
    //说明此时pos在0 -- n之间
    *e = pList->data[pos];
    return TRUE;
}

//    查元素:查找给定元素值的位置
//相同值只去第一个
//返回值:-1表示没有找到,否则返回带查找元素的角标
//pList:传入的数组顺序表,Key比对的值
int LocateElemSqList(SequenList* pList, ElemType key) 
{
    int i;
    for (i = 0;i < pList->last;i++) 
    {
        if (pList->data[i] == key)
            return i;
    }
    return -1;
}

//    插入元素:在指定的位置插入给定的值
// 插入的位置为k:k: 0 -- n-1
// 顺序表:不满
//pList:目标顺序表,x待插入的元素,k插入的位置
int InsertElemSqList(SequenList* pList, ElemType x, int k) 
{
    int j;

    //顺序表尚未填满
    if (pList->last >= LIST_SIZE - 1)
        return FALSE;

    //表明K是有效位置
    if (k<0 || k>(pList->last + 1))
        return FALSE;

    for (j = pList->last;j >= k;j--) 
    {
        pList->data[j + 1] = pList->data[j];//插入元素,元素要后移
    }
    pList->data[k] = x;
    pList->last = pList->last + 1; //顺序表长度要加1
    return TRUE;
}

//删除:删除指定位置的值或者是删除给定的值。
//pList:目标顺序数组,k表示需要删除的位置
int DelElemSqList(SequenList *pList, int k) 
{
    //参数k有效性检查
    if ((k >= 0 && k <= pList->last) && (pList->last != 0)) 
    {
        for (int j = k;j <= pList->last;j++) {
            pList->data[j] = pList->data[j + 1];
        }
        pList->last--;
        return TRUE;
    }
    return FALSE;
}

//遍历元素:从头到尾扫描线性表。
void showSeqList(SequenList* pList) 
{
    for (int i = 0;i < pList->last;i++) 
    {
        printf(" %d", pList->data[i]);
    }
}

main.c测试接口

#include"SeqList.h"

int main(void) 
{
    lPtr = InitSeq();//这样是否可以=>可以的,且使用NULL来判断是否初始化完毕
    if (lPtr) 
    {
        //todo:继续使用这个顺序表
        for (int i = 0;i < 10;i++) 
        {
            InsertElemSqList(lPtr, i, i);
        }
        printf("初始化后顺序表的元素个数:%d", GetSizeSeq(lPtr));
        printf("************\n");
        showSeqList(lPtr);


        InsertElemSqList(lPtr, 2000, 0);
        printf("初始化后顺序表的元素个数:%d", GetSizeSeq(lPtr));
        printf("************\n");
        showSeqList(lPtr);


        DelElemSqList(lPtr, 1);
        printf("初始化后顺序表的元素个数:%d", GetSizeSeq(lPtr));
        printf("************\n");
        showSeqList(lPtr);


        int pos = LocateElemSqList(lPtr, 16); //查找给定元素的位置
        if (pos >= 0) 
        {
            printf("当前元素位于%d", pos);
        }
        else 
        {
            printf("没有找到这个元素");
        }
        printf("************\n");
        showSeqList(lPtr);
        
    }
    else 
    {
        //todo:提示没有可以使用的空间
    }
    getchar();
    getchar();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值