代码注释部分已经很详细啦,直接看代码就好
代码思路:
头文件
结构体类型定义
函数声明
{
}
函数实现
{
增删改查
排序
倒置
判空
判满
...
}
主函数
{
调用测试案例
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <malloc.h>//内存的申请,free用于释放
#include <stdlib.h>//包含了exit函数
//定义结构体类型,保存顺序表(数组),类型名叫struct Arr
typedef struct Arr
{
int* pBase;//描述的是数组的第一个元素的地址
int len;//描述数组的长度
int cnt;//当前有效元素的个数;
}Array,*Arr;
void init_arr(Array* pArr,int length);//初始化顺序表
int insert_arr(Array* pArr,int pos,int val);//向表里插入元素
int append_arr();//追加元素,末尾增加
int delete_arr(Array* pArr, int pos, int* val);//删除元素
int isEmpty(Array* pArr);//判空
int isFull(Array* pArr);//判满
void sort_arr(Array* pArr);//排序表里元素
void show_arr(Array* pArr);//打印表里元素
void inversion_arr(Array* pArr);//将顺序表反转
void init_arr(Array* pArr, int length)//初始化顺序表
{
pArr->pBase=(int*)malloc(sizeof(int)*length);
//向内存申请(sizeof(int)*length)字节的空间,返回(int*)类型
//将首字节(首空间)的地址赋给pBase成员
if (NULL == pArr->pBase)
{
printf("动态内存分配失败");
exit(-1);//终止整个程序
}
else
{
pArr->len = length;
pArr->cnt = 0;
}
return;
}
int applend_arr(Array* pArr, int val)//向顺序表里添加元素
{
pArr->pBase[pArr->cnt] = val;
(pArr->cnt)++;
return 1;//表示追加成功
}
int is_empty(Array* pArr)//判断表是否为空
{
if (0 == pArr->cnt)
return 1;//1表示为空表
else
return 0;//表示不为空表
}
int isFull(Array* pArr)//判断表是否满了
{
if (pArr->cnt== pArr->len)
{
return 1;//1表示满了
}
else
{
return 0;//0表示没满
}
}
void show_arr(Array *pArr)//打印表里元素
{
int i = 0;
if (1 == is_empty(pArr))
{
printf("the list is empty!\n");
}
else
{
for (i = 0; i < pArr->cnt; i++)
printf("%d\n", pArr->pBase[i]);
}
}
int insert_arr(Array* pArr, int pos,int val)//向表里插入元素,在pos位置前面插入值为val的元素,pos的值从2开始
{
int i = 0;
if (isFull(pArr))
{
printf("表已满,不能插入\n");
return 0;//0表示插入失败
}
if (pos<0 || pos > pArr->cnt + 1)
{
printf("插入位置不合法");
return 0;//0表示插入不成功
}
else
{
int i = 0;
for (i = pArr->cnt - 1; i >= pos - 1; i--) {
pArr->pBase[i + 1] = pArr->pBase[i];
}
pArr->pBase[pos - 1] = val;
pArr->cnt++;
return 1;//1表示插入成功
}
}
int delete_arr(Array* pArr,int pos,int* val)//删除第pos个位置的元素,值为val
{
int i;
if (is_empty(pArr))
{
printf("空表不能删除");
return 0;//0表示删除失败
}
if (pos > pArr->cnt || pos < 1)
{
printf("删除位置非法");
return 0;//0表示删除失败
}
*val = pArr->pBase[pos - 1];//val表示被删除元素的地址。*val表示被删除元素的地址
for (i = pos; i < pArr->cnt; i++)
{
pArr->pBase[i - 1] = pArr->pBase[i];
}
pArr->cnt--;
return 1;//1表示删除成功
}
void sort_arr(Array* pArr)//排序表里元素,冒泡排序,从大到小的顺序
{
int i = 0;
int temp;
for (i = 0; i < pArr->cnt; i++)
{
for (int j = 0; j + 1 < pArr->cnt - i; j++)
{
if (pArr->pBase[j] < pArr->pBase[j + 1])
{
temp = pArr->pBase[j + 1];
pArr->pBase[j + 1] = pArr->pBase[j];
pArr->pBase[j] = temp;
}
}
}
show_arr(pArr);
return;
}
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;
}
int main()
{
int* val;//记录被删除元素的值
Array arr;//定义结构体变量
int length = 10;
init_arr(&arr, length);//初始化表,传地址,初始化长度为10的数组
int i = 0;
for (i = 0; i < 10; i++) {
applend_arr(&arr, i);
}
show_arr(&arr);
insert_arr(&arr, 3, 6);//因为表中已经有了十个元素,在第三个位置插入6的操作超出了已申请的空间,所以不能成功
show_arr(&arr);
delete_arr(&arr, 1, &val);
show_arr(&arr);
printf("%d\n", val);
sort_arr(&arr);
inversion_arr(&arr);
show_arr(&arr);
return 0;
}
运行结果:
仔细分析代码运行过程以及结果进行复习。
其中用到了冒泡排序算法。