Loading

顺序表的操作(C语言实现,基于malloc)

顺序表的操作(动态分配内存版)

编写一个程序,实现顺序表的以下基本运算:

1) 顺序表的初始化;

2) 顺序表的插入;

3) 顺序表的删除;

4) 求顺序表的长度;

5) 删除表中重复出现的元素;

6) 按序号查找节点值;

7) 按节点值查找序号。

#include <stdio.h>
#include<stdlib.h>//exit的使用
#include<malloc.h>
#include<stdbool.h>
//定义一个结构体变量
struct Arr
{
    int cnt;//数组元素有效个数、节点的序号
    int len;//数组长度
    int* pBase;//数组首地址
};
void Init_arr(struct Arr* array, int length);//初始化一个数组
bool Is_empty(struct Arr* array);//检查表是否为空
bool Is_full(struct Arr* array);//检查数组元素是否已满
void append(struct Arr* array, int val);//在数组末尾追加一个元素
void Show_arr(struct Arr* array);//显示数组
void Insert_arr(struct Arr* array, int pos, int val);
/*在数组的第pos个位置插入一个数字val,此时数组的有效长度要加一*/
void delete_arr(struct Arr* array, int pos);
//删除数组中第pos个位置上的元素,并且返回删除的值
void inversion(struct Arr* array);//将数组内元素倒置
void Showmenu();//显示菜单栏
void GetLength(struct Arr* array);//求当前表长度
bool FindElement(struct Arr* array, int num);//根据节点值查找序号
bool FindSerial(struct Arr* array, int num);//根据序号查节点值
bool DeleteRepeat(struct Arr* array);
int main()
{
    //首先定义一个表出来
    struct Arr array;
    //初始化
    Init_arr(&array, 50);
    printf("初始化并添加元素,定义总长50追加8个元素\n");
    printf("****************************\n");
    append(&array, 1);
    append(&array, 15);
    append(&array, 26);
    append(&array, 26);
    append(&array, 45);
    append(&array, 59);
    append(&array, 68);
    append(&array, 74);
    Show_arr(&array);
    printf("插入操作\n");
    printf("****************************\n");
    //插入操作(在第三个位置插入6)
    Insert_arr(&array, 3, 6);
    Show_arr(&array);
    printf("删除操作\n");
    printf("****************************\n");
    //删除操作(删除第6个元素)
    delete_arr(&array, 6);
    Show_arr(&array);
    printf("求长度操作\n");
    printf("****************************\n");
    //求长度
    GetLength(&array);
    printf("删除重复元素操作\n");
    printf("****************************\n");
    //删除重复元素
    DeleteRepeat(&array);
    Show_arr(&array);
    printf("按照序号找节点操作:序号:4\n");
    printf("****************************\n");
    //按照序号找节点
    FindSerial(&array, 4);
    printf("按照节点找序号操作:节点值:26\n");
    printf("****************************\n");
    //按照节点找序号
    FindElement(&array, 26);
  
    return 0;
}
void Init_arr(struct Arr* array, int length)//初始化一个数组
{
    array->pBase = (int*)malloc(sizeof(int) * length);//动态分配一块地址
    if (NULL == array->pBase)
    {
        printf("动态分配内存失败!\n");
        exit(-1);//如果失败就终止整个程序
    }
    else {//如果成功就继续初始化
        array->cnt = 0;
        array->len = length;
    }
    printf("初始化成功\n");
    return;
}
bool Is_empty(struct Arr* array)//接受一个地址值
{
    if (array->cnt == 0) //判断数组内的有效数字,如果有效数字是0那么这个数组为空
    {
        return false;
    }
    else
    {
        return true;
    }
}
void Show_arr(struct Arr* array)
{
    if (Is_empty(array) == false)//传进来的*array已经是一个地址所以不用加取地址符
    {
        printf("这个数组为空!\n");
    }
    else {
        printf("数组内的元素有:");
        for (int i = 0; i < array->cnt; i++)
        {
            printf("%d ", array->pBase[i]);
        }
        printf("\n");
    }
}
bool Is_full(struct Arr* array)
{
    if (array->cnt == array->len)//如果数组的有效元素个数等于数组长度,那么这个数组就满了
    {
        return false;
    }
    else {
        return true;
    }
}
void append(struct Arr* array, int val)
{
    if (Is_full(array) == false)
    {
        printf("添加失败\n");
    }
    else {
        array->pBase[array->cnt] = val;
        (array->cnt)++;
        printf("添加成功\n");
    }
}
void Insert_arr(struct Arr* array, int pos, int val)
{
    if (Is_full(array) == false)
    {
        printf("这个数组已满,无法继续插入\n");

    }
    else if (pos < 1) {
        printf("请不要捣乱\n");
    }
    else {

        for (int i = (array->cnt - 1); i >= pos - 1; i--)
        {
            array->pBase[i + 1] = array->pBase[i];
        }
        array->pBase[pos - 1] = val;
        array->cnt++;
        printf("插入成功");
    }

}
void delete_arr(struct Arr* array, int pos)
{
    //首先判断是否为空表
    if (Is_empty(array) == false)
    {
        printf("该表是空表\n");
    }
    else {
        int ss = array->pBase[pos - 1];
        for (int i = pos; i < array->cnt; i++)
        {
            array->pBase[i - 1] = array->pBase[i];
        }
        array->cnt--;
        printf("删除成功!删除的元素是:");
        printf("%d \n", ss);
    }
}
void inversion(struct Arr* array)
{
    //判断是否为空
    if (Is_empty(array) == false)
    {
        printf("该表为空");
    }
    else {
        int i = 0; int n = array->cnt - 1;
        while (i < n)
        {
            int temp = array->pBase[i];
            array->pBase[i] = array->pBase[n];
            array->pBase[n] = temp;
            i++;
            n--;
        }
    }
}
void Showmenu()
{
    printf("******************线性表******************\n");
    printf("******************************************\n");
    printf("*****************1、初始化****************\n");
    printf("*****************2、插入******************\n");
    printf("*****************3、删除******************\n");
    printf("*****************4、求长度****************\n");
    printf("*****************5、删重复****************\n");
    printf("*****************6、按序号查节点**********\n");
    printf("*****************7、按节点查序号**********\n");
    printf("*****************8、显示当前的表**********\n");
    printf("******************************************\n");
}
void GetLength(struct Arr* array)
{
    printf("当前表总长度为%d\n", array->len);
    printf("当前表长度为%d\n", array->cnt);
    return;
}
bool FindElement(struct Arr* array, int num)//根据节点值查找序号
{
    int temp=0;//节点值对应序号
    for (int i = 0; i < array->cnt; i++)
    {
        if (array->pBase[i] == num)
        {
            temp =i+1;
            printf("该节点值的序号是%d\n", temp);
            break;
        }
    }
    return true;
}
bool FindSerial(struct Arr* array, int num)
{
    if (num > array->cnt || num < 0)
    {
        printf("该序号输入有误");
        return false;
    }
    else {
        printf("该序号的节点值是:%d\n", array->pBase[num]);
        return true;
    }
    
}
bool DeleteRepeat(struct Arr* array)
{
    for (int i = 0; i < array->cnt-1; i++)//遍历数组
    {
        for (int j = i + 1; j < array->cnt; j++)//遍历数组的后一个元素
        {
            if (array->pBase[i] == array->pBase[j])//如果相等就删除
            {
                delete_arr(array, j);
                --j;
            }
        }
    }
    return true;
}
posted @ 2021-03-26 15:05  Msskx  阅读(469)  评论(0)    收藏  举报