• 线性表——顺序表


    线性表结构体:

    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

    本人计算机小白一枚,对编程有浓厚兴趣,在此贴出自己的计算机学习历程,还有很多不足,望多多指教! 读书后发现好多的内容与具体专业有偏差,没来得及完成,虽然“有时间我就会做...”是人生最大的谎言,但有时间我会继续搞定未完成的内容,有始有终,兴趣使然!
  • 相关阅读:
    线段树【加强】
    ATM(BZOJ 1179)
    Trick or Treat on the Farm
    欧拉回路 HDU
    无序字母对(luogu 1314)
    MooFest
    Snowflake Snow Snowflakes(POJ 3349)
    Firetruck(UVA 208)
    B进制星球(luogu 1604)
    遍历一个树的所有子节点,画出该树,深度不定,广度不定,适用于任何树,深度优先算法
  • 原文地址:https://www.cnblogs.com/Robin5/p/11827963.html
Copyright © 2020-2023  润新知