数据结构与算法之线性表(C语言)


线性表C语言实现

具体代码实现如下:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h> //包含exit函数

//定义结构体类型,保持顺序表(数组),
typedef struct Arr
{
    int *pBase; //描述的数组第一个元素的地址
    int len;    //描述数组的长度
    int cnt;    //当前数组有效元素的个数
} Array;

void init_arr(Array *pArr, int length);         //初始化顺序表
int append_arr(Array *pArr, int val);           //向顺序表里末尾追加新元素
int insert_arr(Array *pArr, int pos, int val);  //向顺序表里插入元素
int delete_arr(Array *pArr, int pos, int *val); //删除表里元素
int is_empty(Array *pArr);                      //判断是否空表
int is_full(Array *pArr);                       //判断是否满表
void sort_arr(Array *pArr);                     //排序表里元素
void inversion_arr(Array *pArr);                //表内元素排列顺序反转
void show_arr(Array *pArr);                     //显示打印表里元素

int main()
{
    int val;            //表示被删除元素的值
    Array arr;          //定义结构体变量
    init_arr(&arr, 10); //初始化长度为10的数组
    append_arr(&arr, 5);
    append_arr(&arr, 4);
    append_arr(&arr, 3);
    append_arr(&arr, 2);
    append_arr(&arr, 1);
    // insert_arr(&arr, 6, 6);
    show_arr(&arr);
    sort_arr(&arr);
    // inversion_arr(&arr);
    show_arr(&arr);
    delete_arr(&arr, 3, &val);
    //删除测试
    // delete_arr(&arr, 3, val);
    // printf("显示被删%d", val);
    printf("\n主函数显示被删元素%d\n", val);
    show_arr(&arr);
}

//初始化顺序表
void init_arr(Array *pArr, int length)
{
    pArr->pBase = (int *)malloc(sizeof(int) * length);
    if (NULL == pArr->pBase)
    {
        printf("动态内存分配失败!\n");
        exit(-1); //终止整个程序
    }
    else
    {
        pArr->len = length;
        pArr->cnt = 0;
    }
    return;
}

//向顺序表里添加元素
int append_arr(Array *pArr, int val)
{
    pArr->pBase[pArr->cnt] = val;
    (pArr->cnt)++;
    return 1; //1表示追加成功
}

int is_empty(Array *pArr)
{
    if (pArr->cnt == 0)
    {
        return 1; //表示为空表
    }
    else
    {
        return 0; //非空
    }
}

//判断表满
int is_full(Array *pArr)
{
    if (pArr->cnt == pArr->len)
    {
        return 1; //表满
    }
    else
    {
        return 0; //非满
    }
}

//插入元素
int insert_arr(Array *pArr, int pos, int val)
{
    //判断是否为满表
    if (is_full(pArr))
    {
        printf("表满无法插入。\n");
        return 0;
    }
    //判断插入是否合法
    if (pos < 1 || pos > pArr->cnt + 1)
    {
        printf("插入位置不合法。\n");
        return 0; //表示插入失败
    }
    else
    {
        int i;
        for (i = pArr->cnt; i >= pos; i--)
        {
            pArr->pBase[i] = pArr->pBase[i - 1];
        }
        pArr->pBase[pos - 1] = val;
        pArr->cnt++;
        return 1; //表示插入·成功
    }
}

//删除元素
int delete_arr(Array *pArr, int pos, int *val)
//删除第pos位置元素,值保存给val
{
    if (is_empty(pArr))
    {
        printf("表为空无法删除。\n");
        return 0;
    }
    if (pos < 1 || pos > pArr->cnt)
    {
        printf("删除位置不合法。\n");
        return 0;
    }
    else
    {
        int i;
        *val = pArr->pBase[pos - 1]; //val记录了地址,*则取值,相当于val开辟了一个指针地址,可以存要删除元素的地址,然后把地址传到主函数的val,这时候*val已经取到了值,然后进行后面的移位操作。这其中还有待探究!
        // printf("赋地址显示被删%d\n", val);
        for (i = pos; i < pArr->cnt; i++)
        {
            pArr->pBase[i - 1] = pArr->pBase[i];
        }
        // printf("更改后显示被删%d\n", val);

        pArr->cnt--;

        return 1; //删除成功
    }
}

//冒泡排序
void sort_arr(Array *pArr)
{

    int i, j;
    int temp;
    for (i = 0; i < pArr->cnt - 1; i++)
    {
        for (j = 0; j < pArr->cnt - i - 1; j++)
        {
            if (pArr->pBase[j] > pArr->pBase[j + 1])
            {
                temp = pArr->pBase[j];
                pArr->pBase[j] = pArr->pBase[j + 1];
                pArr->pBase[j + 1] = temp;
            }
        }
    }
}

//顺序表元素反转
void inversion_arr(Array *pArr)
{
    int i = 0;
    int j = pArr->cnt - 1;
    int temp;
    while (i < j)
    {
        temp = pArr->pBase[i];
        pArr->pBase[i] = pArr->pBase[j];
        pArr->pBase[j] = temp;
        i++;
        j--;
    }
    return;
}

//打印元素
void show_arr(Array *pArr)
{
    int i;
    if (is_empty(pArr))
    {
        printf("该表为空表。\n");
    }
    else
    {
        for (i = 0; i < pArr->cnt; i++)
            printf("%d\t", pArr->pBase[i]);
    }
}

文章作者: 风栾
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 风栾 !
评论
 上一篇
MongoDB速查手册 MongoDB速查手册
expressgit 本地版本控制
2020-11-04
下一篇 
我是演说家之《教育的意义》 我是演说家之《教育的意义》
《教育的意义》–董仲蠡大家好,我叫董仲蠡,是一名英语培训师。我累计培训的学员有15万,我曾经教出过考研全市第一的学生,每年因为学过我的课通过四六级考试的不计其数。同学们都非常相信我、尊重我,叫我“小董老师”。 但是,很多时候,作为老师,我也
2020-08-26
  目录