线性表——顺序表

线性表结构体:

typedef struct Array{
    int len; // 记录数组内有效元素个数
    int max; // 记录最大元素个数
    int *pBase;
}Ar, *pAr;

顺序表基本运算:

初始化一个Array

pAr CreatArray(int num) //初始化一个Array
{
    pAr parr = (pAr)malloc(sizeof(Ar));

    if (NULL == parr)
    {
        printf("动态内存分配失败!程序终止!
");
        exit(-1);
    }
    parr->pBase = (int *)malloc(sizeof(int)*num);
    if (NULL == parr->pBase)
    {
        printf("动态内存分配失败!程序终止!
");
        exit(-1);
    }
    parr->len = 0; // 置初始化长度为0
    parr->max = num; // 置最大长度为num
    return parr;
}

在数组的末尾追加元素

int Append_Val(pAr parr, int val) // 在数组的末尾追加元素
{
    // 数组满了不能追加
    if (Is_Array_Full(parr))
    {
        printf("顺序表已满,追加失败!
");
        return 0;
    }
    // 将数据val写入末尾位置,并刷新当前数组长度
    parr->pBase[parr->len] = val;
    parr->len++;
    return 1;
}

数组的排序

void Sort_Array(pAr parr) // 数组的排序
{
    // 使用冒泡排序算法
    int temp;
    for (int i=0; i<parr->len; i++)
        for (int j=0; j<parr->len; j++)
            if (parr->pBase[i] > parr->pBase[j])
            {
                temp = parr->pBase[i];
                parr->pBase[i] = parr->pBase[j];
                parr->pBase[j] = temp;
            }
    return;
}

遍历一个数组

void Show_Array(pAr parr) // 遍历一个数组
{
    for (int i=0; i<parr->len; i++)
        printf("Array[%d] = %d
",i+1,parr->pBase[i]);
    return;
}

某一个位置之前插入

int Insert_Array_pre(pAr parr, int length, int val)// 某一个位置之前插入
{
    int i;
    if (length<0 || length>parr->len)
    {
        printf("元素插入位置无效!插入失败!
");
        return 0;
    }
    if ( Is_Array_Full(parr) )
    {
        printf("顺序表已满,插入失败!
");
        return 0;
    } else
        parr->len++;
    for (i=parr->len-1; i>length-1; i--)
        parr->pBase[i] = parr->pBase[i-1];
    parr->pBase[i] = val;
    return 1;
}

删除某一元素,并且将第一次出现的位置下标发送给主函数

int Delete_Val(pAr parr, int * length, int val)// 删除某一元素,并且将第一次出现的位置下标发送给主函数
{
    int i, flag=0;

    for (i=0; i<parr->len; i++)
    {
        if (val == parr->pBase[i] && 0 == flag)
        {
            *length = i+1; // 记录val第一次出现的位置
            flag = 1;
        }
        if (1 == flag)
        {
            parr->pBase[i] = parr->pBase[i+1];
        }
    }
    if (1 == flag)
    {
        parr->len --;
        return 1;
    } else
        return 0;
}

删除固定位置,并且将删除的元素发送给主函数

int Delete_Len(pAr parr, int length, int * val) // 删除固定位置,并且将删除的元素发送给主函数
{
    int i;
    if (length<0 || length>parr->len)
    {
        printf("元素位置不存在,删除失败!
");
        return 0;
    }
    *val = parr->pBase[length-1];
    for (i=length-1; i<parr->len; i++)
    {
        parr->pBase[i] = parr->pBase[i+1];
    }
    parr->len--;
    return 1;
}

判断数组是否为满

int Is_Array_Full(pAr parr) // 判断数组是否为满
{
    if (parr->max == parr->len)
        return 1;
    else
        return 0;
}

判断数组是否为空

int Is_Array_Empty(pAr parr)// 判断数组是否为空
{
    if (0 == parr->len)
        return 1;
    else
        return 0;
}

整体表示:

Array.h文件

 1 // 创建一个顺序表
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 typedef struct Array{
 6     int len; // 记录数组内有效元素个数
 7     int max; // 记录最大元素个数
 8     int *pBase;
 9 }Ar, *pAr;
10 
11 pAr CreatArray(int num); //初始化一个Array
12 int Append_Val(pAr parr, int val); // 在数组的末尾追加元素
13 void Sort_Array(pAr parr); // 数组的排序
14 void Show_Array(pAr parr); // 展现一个数组
15 int Insert_Array_pre(pAr parr, int length, int val);// 某一个位置之前插入
16 int Delete_Val(pAr parr, int * length, int val);// 删除某一元素,并且将第一次出现的位置下标发送给主函数
17 int Delete_Len(pAr parr, int length, int * val);// 删除固定位置,并且将删除的元素发送给主函数
18 int Is_Array_Full(pAr parr); // 判断数组是否为满
19 int Is_Array_Empty(pAr parr);// 判断数组是否为空
Array.h

Array.c文件

#include "Array.h"

int Is_Array_Full(pAr parr) // 判断数组是否为满
{
    if (parr->max == parr->len)
        return 1;
    else
        return 0;
}

int Is_Array_Empty(pAr parr)// 判断数组是否为空
{
    if (0 == parr->len)
        return 1;
    else
        return 0;
}

pAr CreatArray(int num) //初始化一个Array
{
    pAr parr = (pAr)malloc(sizeof(Ar));

    if (NULL == parr)
    {
        printf("动态内存分配失败!程序终止!
");
        exit(-1);
    }
    parr->pBase = (int *)malloc(sizeof(int)*num);
    if (NULL == parr->pBase)
    {
        printf("动态内存分配失败!程序终止!n");
        exit(-1);
    }
    parr->len = 0; // 置初始化长度为0
    parr->max = num; // 置最大长度为num
    return parr;
}

int Append_Val(pAr parr, int val) // 在数组的末尾追加元素
{
    // 数组满了不能追加
    if (Is_Array_Full(parr))
    {
        printf("顺序表已满,追加失败!
");
        return 0;
    }
    // 将数据val写入末尾位置,并刷新当前数组长度
    parr->pBase[parr->len] = val;
    parr->len++;
    return 1;
}

void Sort_Array(pAr parr) // 数组的排序
{
    // 使用冒泡排序算法
    int temp;
    for (int i=0; i<parr->len; i++)
        for (int j=0; j<parr->len; j++)
            if (parr->pBase[i] > parr->pBase[j])
            {
                temp = parr->pBase[i];
                parr->pBase[i] = parr->pBase[j];
                parr->pBase[j] = temp;
            }
    return;
}

void Show_Array(pAr parr) // 展现一个数组
{
    for (int i=0; i<parr->len; i++)
        printf("Array[%d] = %d
",i+1,parr->pBase[i]);
    return;
}

int Insert_Array_pre(pAr parr, int length, int val)// 某一个位置之前插入
{
    int i;
    if (length<0 || length>parr->len)
    {
        printf("元素插入位置无效!插入失败!
");
        return 0;
    }
    if ( Is_Array_Full(parr) )
    {
        printf("顺序表已满,插入失败!
");
        return 0;
    } else
        parr->len++;
    for (i=parr->len-1; i>length-1; i--)
        parr->pBase[i] = parr->pBase[i-1];
    parr->pBase[i] = val;
    return 1;
}

int Delete_Val(pAr parr, int * length, int val)// 删除某一元素,并且将第一次出现的位置下标发送给主函数
{
    int i, flag=0;

    for (i=0; i<parr->len; i++)
    {
        if (val == parr->pBase[i] && 0 == flag)
        {
            *length = i+1; // 记录val第一次出现的位置
            flag = 1;
        }
        if (1 == flag)
        {
            parr->pBase[i] = parr->pBase[i+1];
        }
    }
    if (1 == flag)
    {
        parr->len --;
        return 1;
    } else
        return 0;
}
int Delete_Len(pAr parr, int length, int * val) // 删除固定位置,并且将删除的元素发送给主函数
{
    int i;
    if (length<0 || length>parr->len)
    {
        printf("元素位置不存在,删除失败!
");
        return 0;
    }
    *val = parr->pBase[length-1];
    for (i=length-1; i<parr->len; i++)
    {
        parr->pBase[i] = parr->pBase[i+1];
    }
    parr->len--;
    return 1;
}

简单测试示例:

//main.c
#include "Array.h"

int main() {
    int length;
    pAr parr = CreatArray(5);
    Append_Val(parr,1);
    printf("%d ",Delete_Val(parr,&length,1));
    Show_Array(parr);
    return 0;
}

RR

本人计算机小白一枚,对编程有浓厚兴趣,在此贴出自己的计算机学习历程,还有很多不足,望多多指教! 读书后发现好多的内容与具体专业有偏差,没来得及完成,虽然“有时间我就会做...”是人生最大的谎言,但有时间我会继续搞定未完成的内容,有始有终,兴趣使然!
原文地址:https://www.cnblogs.com/Robin5/p/11827963.html