zoukankan      html  css  js  c++  java
  • 线性表——顺序表

    线性表结构体:

    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

    本人计算机小白一枚,对编程有浓厚兴趣,在此贴出自己的计算机学习历程,还有很多不足,望多多指教! 读书后发现好多的内容与具体专业有偏差,没来得及完成,虽然“有时间我就会做...”是人生最大的谎言,但有时间我会继续搞定未完成的内容,有始有终,兴趣使然!
  • 相关阅读:
    2013.4.15 Particle Swarm Optimization with Skyline Operator for Fast Cloudbased Web Service Composition
    Adaptive service composition in flexible processes
    2013.4.13 DomainSpecific Service Selection for Composite Services
    2013.4.14 Modeling and Algorithms for QoSAware Service Composition in VirtualizationBased Cloud Computing
    2013.5.29 Towards Networkaware Service Composition in the Cloud
    Efficient algorithms for Web services selection with endtoend QoS constraints
    SQL Server中常用的SQL语句
    接口限流自定义注解
    linux服务器生产环境搭建
    MVEL自定义函数重复掉用报错:duplicate function
  • 原文地址:https://www.cnblogs.com/Robin5/p/11827963.html
Copyright © 2011-2022 走看看