简单学习了一下线性表
作者的提前告知:
所有的知识点都在代码里面了
ps:
对于有要求从键盘读入数据的,大家自行写一下吧,很简单
//-------------------------------------------------------
// --必看--
//备注:
// 1、此顺序表从数组下标第一位开始存储数据
// - 在t.head[1] 开始存储第一个数据
// - t.head[0]作为哨兵位或者temp变量位置
// 2、此程序中向顺序表中录入数据放在主函数,利用for循环实现;
// - 键盘录入请自行新建输入函数
//-------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
//-------------------------------------------------------
// --宏定义部分--
//备注:
// 1、ApplySize表示实际申请空间
// 2、Size表示实际数据使用空间
// ps:此顺序表从数组下标第一位开始存储数据
// - 在t.head[1] 开始存储第一个数据
// - t.head[0]作为哨兵位或者temp变量位置
//
// 3、Sentry表示t.head[0]的值 即:哨兵值
//-------------------------------------------------------
#define ApplySize 11 //实际申请空间大小
#define Size (ApplySize-1)//对Size进行宏定义,表示顺序表存储数据使用的空间大小
#define Sentry 0 //哨兵值
//-------------------------------------------------------
// --线性表的存储结构自定义--
// -Table
//注:顺序表除了要申请足够大小的物理空间外还需要时时记录以下两项数据
//1.顺序表申请的存储容量;
//2.顺序表的长度,也就是表中存储数据元素的个数;
//提示: 正常状态下,顺序表申请的存储容量要大于顺序表的长度
//-------------------------------------------------------
typedef int CharType ;//自定义数据类型
typedef struct Table{
CharType * head;//声明了一个名为head的长度不确定的数组,也叫“动态数组”
CharType length;//记录当前顺序表的长度
CharType size;//记录顺序表分配到存储容量
}Table;
//-------------------------------------------------------
// --自定义函数--
//1、建立顺序表:
// -initTable();
// -给head动态数据申请足够大小的物理空间
// -对t.head[0] 进行”哨兵“数值的初始化
// -给size和length赋值
//2、输出顺序表中的元素
// -displayTable();
//3、顺序表插入函数:
// -InsertTable();
// -插入函数核心两步:
// -将要插入位置元素以及后续的元素整体向后移动一个位置
// -将元素放到腾出来的位置上
// ps:当顺序表满时,需要使用realloc()函数分配新增的空间
//4、顺序表删除函数:
// -DelTable()
// -删除元素一步:
// -找到目标元素,并将其后续所以元素整体前移一个位置
//5、顺序表按值查找函数:
// -SelectTable();
// -返回位置
//6、顺序表按位更改元素:
// -AmendTable();
//-------------------------------------------------------
Table initTable(){
Table t;
t.head = (CharType *)malloc(ApplySize *sizeof(CharType));//构造一个空的顺序表,动态申请存储空间
if (!t.head)//如果申请失败,做出提示并且退出程序
{
printf("顺序表初始化失败\n");
exit(0);
}
t.head[0] = Sentry;
t.length = 0;//空表的长度初始化为0
t.size = Size;//空表的初始存储空间为Size
return t;
}
void displayTable(Table t){
printf("顺序表中存储的元素分别是:\n");
int i;
for(i = 1; i <= t.length; i++)
{
printf("%4d",t.head[i]);
}
printf("\n");
}
Table InsertTable(Table t, CharType elem, int position)//插入函数,elem为插入的元素,position为插入到顺序表中的位置
{
//判断插入本身是否存在问题(如果插入元素位置超出最大范围(位置=> t.head[Size])还大。或者插入的位置为0,或者位置本身不存在,程序给出提示并结束插入操作
if(position > t.length )
{
printf("您要插入的位置大于长度,进行尾插\n");
}
if(position < 1)
{
printf("插入位置非法\n");
return t;
}
//做插入操作时,首先需要看顺序表是否有多余的存储空间提供给 插入的元素,如果没有,需要申请
if(t.length == t.size){
t.head = (CharType *)realloc(t.head, (t.size+1+1) *sizeof(CharType));//使用realloc函数从新给t.head分配空间,,size+1+1 是为了补全0位。
if(!t.head){
printf("存储分配失败!\n");
return t;
}
t.size += 1;
}
//插入操作,需要将从插入位置开始的后续元素,逐个后移
int i;
for(i = t.length; i >= position; i--)
{
t.head[i+1] = t.head[i];
}
//后移完成后,直接将所需插入元素,添加到顺序表中的相应位置
t.head[position] = elem;
//由于添加了元素,使用长度+1
t.length++;
return t;
}
Table DelTable(Table t, CharType position)
{
if(position > t.length || position < 1)
{
printf("被删除元素位置有误\n");
return t;
}
//删除操作
int i;
for(i = position; i < t.length; i++)
{
t.head[i] = t.head[i + 1];
}
t.length--;
return t;
}
int SelectTable(Table t, CharType value)
{
int i;
int flag = 0;
for(i = 1; i <= t.length; i++)
{
if(t.head[i] == value){
flag = 1;
return i;
}
}
if(flag == 0)
printf("该值不存在!\n");
}
Table AmendTable(Table t, int position, CharType value){
t.head[position] = value;
return t;
}
//-------------------------------------------------------
// --主函数--
//1、向顺序表中添加元素放在了主函数中
//-------------------------------------------------------
int main()
{
Table t = initTable();
//向顺序表中添加元素
int i;
for(i = 1; i <= Size; i++)
{
t.head[i] = i;
t.length++;
}
printf("原顺序表:\n");
displayTable(t);
printf("删除元素1:\n");
t = DelTable(t,1);
printf("完成:\n");
displayTable(t);
printf("在第2的位置插入元素5:\n");
t = InsertTable(t, 5 , 2);
displayTable(t);
printf("查找元素3的位置:\n");
i = SelectTable(t, 3);
printf("该值的位置为%4d\n",i);
printf("将元素7改为6:\n");
i = SelectTable(t, 7);
t = AmendTable(t, i, 6);
displayTable(t);
return 0;
}