线性表——顺序表

懵懂的女人 提交于 2019-12-04 02:10:49

线性表结构体:

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("动态内存分配失败!程序终止!\n");
        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("顺序表已满,追加失败!\n");
        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\n",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("元素插入位置无效!插入失败!\n");
        return 0;
    }
    if ( Is_Array_Full(parr) )
    {
        printf("顺序表已满,插入失败!\n");
        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("元素位置不存在,删除失败!\n");
        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文件

  1 #include "Array.h"
  2 
  3 int Is_Array_Full(pAr parr) // 判断数组是否为满
  4 {
  5     if (parr->max == parr->len)
  6         return 1;
  7     else
  8         return 0;
  9 }
 10 
 11 int Is_Array_Empty(pAr parr)// 判断数组是否为空
 12 {
 13     if (0 == parr->len)
 14         return 1;
 15     else
 16         return 0;
 17 }
 18 
 19 pAr CreatArray(int num) //初始化一个Array
 20 {
 21     pAr parr = (pAr)malloc(sizeof(Ar));
 22 
 23     if (NULL == parr)
 24     {
 25         printf("动态内存分配失败!程序终止!\n");
 26         exit(-1);
 27     }
 28     parr->pBase = (int *)malloc(sizeof(int)*num);
 29     if (NULL == parr->pBase)
 30     {
 31         printf("动态内存分配失败!程序终止!n");
 32         exit(-1);
 33     }
 34     parr->len = 0; // 置初始化长度为0
 35     parr->max = num; // 置最大长度为num
 36     return parr;
 37 }
 38 
 39 int Append_Val(pAr parr, int val) // 在数组的末尾追加元素
 40 {
 41     // 数组满了不能追加
 42     if (Is_Array_Full(parr))
 43     {
 44         printf("顺序表已满,追加失败!\n");
 45         return 0;
 46     }
 47     // 将数据val写入末尾位置,并刷新当前数组长度
 48     parr->pBase[parr->len] = val;
 49     parr->len++;
 50     return 1;
 51 }
 52 
 53 void Sort_Array(pAr parr) // 数组的排序
 54 {
 55     // 使用冒泡排序算法
 56     int temp;
 57     for (int i=0; i<parr->len; i++)
 58         for (int j=0; j<parr->len; j++)
 59             if (parr->pBase[i] > parr->pBase[j])
 60             {
 61                 temp = parr->pBase[i];
 62                 parr->pBase[i] = parr->pBase[j];
 63                 parr->pBase[j] = temp;
 64             }
 65     return;
 66 }
 67 
 68 void Show_Array(pAr parr) // 展现一个数组
 69 {
 70     for (int i=0; i<parr->len; i++)
 71         printf("Array[%d] = %d\n",i+1,parr->pBase[i]);
 72     return;
 73 }
 74 
 75 int Insert_Array_pre(pAr parr, int length, int val)// 某一个位置之前插入
 76 {
 77     int i;
 78     if (length<0 || length>parr->len)
 79     {
 80         printf("元素插入位置无效!插入失败!\n");
 81         return 0;
 82     }
 83     if ( Is_Array_Full(parr) )
 84     {
 85         printf("顺序表已满,插入失败!\n");
 86         return 0;
 87     } else
 88         parr->len++;
 89     for (i=parr->len-1; i>length-1; i--)
 90         parr->pBase[i] = parr->pBase[i-1];
 91     parr->pBase[i] = val;
 92     return 1;
 93 }
 94 
 95 int Delete_Val(pAr parr, int * length, int val)// 删除某一元素,并且将第一次出现的位置下标发送给主函数
 96 {
 97     int i, flag=0;
 98 
 99     for (i=0; i<parr->len; i++)
100     {
101         if (val == parr->pBase[i] && 0 == flag)
102         {
103             *length = i+1; // 记录val第一次出现的位置
104             flag = 1;
105         }
106         if (1 == flag)
107         {
108             parr->pBase[i] = parr->pBase[i+1];
109         }
110     }
111     if (1 == flag)
112     {
113         parr->len --;
114         return 1;
115     } else
116         return 0;
117 }
118 int Delete_Len(pAr parr, int length, int * val) // 删除固定位置,并且将删除的元素发送给主函数
119 {
120     int i;
121     if (length<0 || length>parr->len)
122     {
123         printf("元素位置不存在,删除失败!\n");
124         return 0;
125     }
126     *val = parr->pBase[length-1];
127     for (i=length-1; i<parr->len; i++)
128     {
129         parr->pBase[i] = parr->pBase[i+1];
130     }
131     parr->len--;
132     return 1;
133 }
Array.c

简单测试示例:

//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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!