顺序表的基本用法

顺序表的基本用法

1. 结构体定义(动态分配)

typedef int ElemType;       //元素类型,可自行定义,这里定义为int型,仅做区分

struct LIST {
    int lengh;              //当前顺序表长度
    int MaxSize;            //顺序表的最大长度
    ElemType *data;         //该顺序表的元素类型是int型(动态分配) };

2. 基本函数

这里使用了c++的bool类型和引用 文件名需要是.cc或者.cpp

//1.顺序表的初始化
void initList(LIST &list);
//2.增加顺序表的长度
void IncreaseSize(LIST &list,int len);
//3.顺序表的元素查找(按位查找)
bool GetElem(LIST list,int Index,ElemType &Value);
//4.顺序表的元素查找(按值查找)
bool LocateElem(LIST list,int &Index,ElemType Value);
//5.顺序表的元素插入
bool ListInset(LIST &list,int Index,ElemType value);
//6.顺序表的元素删除
bool ListDelete(LIST &list,int Index,ElemType &value);
//7.顺序表的打印
void ListPrint(LIST list);
//8.顺序表的表长
int ListLength(LIST list);
//9.顺序表的销毁
void DestoryList(LIST &list);

3. 完整代码

list.h

#ifndef __LIST_H__
#define __LIST_H__

#include<stdio.h>
#include<stdlib.h>          //malloc使用的头文件

#define InitSize 10

//判空
#define NULLPOINTER_CHECK_RT_NONE(pointer)\
{\
    if (NULL == (pointer))\
    {\
        printf("Pointer is NULL!");\
        return;\
    }\
}

typedef int ElemType;       //元素类型,可自行定义,这里定义为int型,仅做区分

struct LIST
{
    int lengh;              //当前顺序表长度
    int MaxSize;            //顺序表的最大长度
    ElemType *data;         //该顺序表的元素类型是int型(动态分配)
};

//1.顺序表的初始化
void initList(LIST &list);
//2.增加顺序表的长度
void IncreaseSize(LIST &list,int len);
//3.顺序表的元素查找(按位查找)
bool GetElem(LIST list,int Index,ElemType &Value);
//4.顺序表的元素查找(按值查找)
bool LocateElem(LIST list,int &Index,ElemType Value);
//5.顺序表的元素插入
bool ListInset(LIST &list,int Index,ElemType value);
//6.顺序表的元素删除
bool ListDelete(LIST &list,int Index,ElemType &value);
//7.顺序表的打印
void ListPrint(LIST list);
//8.顺序表的表长
int ListLength(LIST list);
//9.顺序表的销毁
void DestoryList(LIST &list);
#endif

list.cc

#include "list.h"

// 1.顺序表的初始化
void initList(LIST &list)
{
    list.data = (ElemType *)malloc(sizeof(ElemType) * InitSize);
    NULLPOINTER_CHECK_RT_NONE(list.data);
    list.lengh = 0;
    list.MaxSize = InitSize;
}

// 2.增加顺序表的长度
void IncreaseSize(LIST &list, int len)
{
    // p是局部变量,函数结束后,自动释放
    ElemType *p = list.data;
    list.data = (ElemType *)malloc(sizeof(ElemType) * (len + list.MaxSize));
    NULLPOINTER_CHECK_RT_NONE(list.data);
    for (int i = 0; i < list.lengh; i++) // 把原来内存的数据拷贝到新申请的内存中
    {
        list.data[i] = p[i];
    }
    list.MaxSize += len; // 修改最大值
    free(p);             // 释放原先申请的内存
}

// 3.顺序表的元素查找(按位查找)
bool GetElem(LIST list, int Index, ElemType &Value)
{
    if (Index < 1 || Index > list.lengh)
        return false;
    Value = list.data[Index - 1];
    return true;
}

// 4.顺序表的元素查找(按值查找)
bool LocateElem(LIST list, int &Index, ElemType Value)
{
    for (int i = 0; i < list.lengh; i++) // 遍历
    {
        if (Value == list.data[i])
        {
            Index = i + 1; // i是数组下标,返回位次要+1
            return true;
        }
    }
    return false;
}

// 5.顺序表的元素插入
bool ListInset(LIST &list, int Index, ElemType value)
{
    if (Index < 1 || Index > list.lengh+1) // Index 不合法
        return false;
    if (list.lengh == list.MaxSize) // 顺序表满了
        return false;
    for (int i = list.lengh; i >= Index; i--) // 插入序列后面的数往后移
    {
        list.data[i] = list.data[i - 1];
    }
    list.data[Index - 1] = value; // 放入值
    list.lengh++;                 // 顺序表的长度+1
    return true;
}

// 6.顺序表的元素删除
bool ListDelete(LIST &list, int Index, ElemType &value)
{
    if (Index < 1 || Index > list.lengh) // Index 不合法
        return false;
    value = list.data[Index - 1];
    for (int i = Index; i < list.lengh-1; i++)// 删除序列后面的数往前移
    {
        list.data[i-1] = list.data[i]; 
    }
    list.lengh--;// 顺序表的长度-1
    return true;
}

//7.顺序表的打印
void ListPrint(LIST list)
{
    if(list.lengh == 0)
        printf("NULL!");
    for(int i = 0;i<list.lengh;i++)
    {
        printf("%d ",list.data[i]);
    }
    printf("\n");
}

//8.顺序表的表长
int ListLength(LIST list)
{
    return list.lengh;
}

//9.顺序表的销毁
void DestoryList(LIST &list)
{
    list.lengh = 0;
    list.MaxSize = 0;
    free(list.data);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值