顺序表的操作(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;
}
代码如诗