新人小白的C语言笔记---线性表的实现
关于线性表的构造和初始化,我学习到了两种形式,第一种通过结构体数组来进行数据的存储,不过它在进行插入和删除操作的时候,太过费劲,同时,结构体数据是存储在栈上,我们无法控制它空间的生成与消失,这时就可以采用第二种方法来避免问题,通过指针,原先存储在数组,现在通过Data指针来进行数据的存储(这时数据存储在堆上)(先给顺序表的开辟空间,然后再给数据存储开辟空间)。
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
//1
//typedef struct {
// //一个整型数组
// ElemType Data[MAXSIZE];
// //length元素的个数(位次)
// int length;
//}SeqList;
//初始化
//void InitList(SeqList* L)
//{
// L->length = 0;
//}
//2:大->中->小的顺序
typedef struct {
ElemType* Data;
int length;
}SeqList;
//初始化
SeqList* InitList()
{
//分配一个线性表的内存
SeqList* L = (SeqList*)malloc(sizeof(SeqList));
//分配一个数组的内存
L->Data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
L->length = 0;
return L;
}
//在尾部插入代码,append:在后面加,增补。
int appendElem(SeqList* L, ElemType e)
{
//做一个线性表中是否满了的判定
if (L->length >= MAXSIZE)
{
printf("已经满了,勿进\n");
return 0;
}
else
{
//如果不是满的,就在L->length这个位置插入一个元素e,也就是尾部。
L->Data[L->length] = e;
//不要忘了计数+1
L->length++;
return 1;
}
}
//遍历输出这个顺序表
void ListElem(SeqList* L)
{
//这里length就是做限制了
for (int i = 0;i < L->length;i++)
{
//这里用数组下标来遍历输出元素
printf("Data[%d]=%d\n", i, L->Data[i]);
}
printf("\n");
}
//插入元素,将被插入的位置后面的数据往后移
int InsertElem(SeqList* L, int pos, ElemType e)
{
if (pos <= L->length)
{
if (L->length > MAXSIZE)
{
printf("插不了了,表满了");
}
else
{
if (pos < 1 || pos >= L->length)
{
printf("插入位置有误");
}
else
{
//利用循环将被插入的位置后面的数据往后移
for (int i = L->length - 1;i >= pos - 1;i--)
{
L->Data[i + 1] = L->Data[i];
}
//插入要插入的元素
L->Data[pos - 1] = e;
//记得给数据个数(长度)加1哦
L->length++;
}
}
}
return 1;
}
//删除某一个位置的元素
int DeleteElem(SeqList* L, int pos, ElemType* e)
{
*e = L->Data[pos - 1];
if (pos < 1 || pos >= L->length)
{
printf("删除操作有误");
}
else
{
if (pos < L->length - 1)
{
//通过循环向前覆盖
for (int i = pos;i < L->length;i++)
{
L->Data[i - 1] = L->Data[i];
}
printf("删除的第%d个元素为%d\n", pos, *e);
}
else {
//nothing
}
L->length--;
}
return 1;
}
//查找
int searchlist(SeqList* L, ElemType e)
{
for (int i = 0;i < L->length;i++)
{
if (L->Data[i] == e)
{
printf("所查的元素在第%d个位置\n", i);
}
else
{
//nothing
}
}
return 0;
}
int main(int argc, char const* argv[])
{
//声明一个线性表并初始化
/*SeqList list;*/
/*InitList(list);*/
SeqList* list = InitList();
appendElem(list, 88);
appendElem(list, 33);
appendElem(list, 75);
appendElem(list, 98);
ListElem(list);
InsertElem(list, 3, 12);
ListElem(list);
ElemType delData;
DeleteElem(list, 2, &delData);
ListElem(list);
searchlist(list, 12);
printf("初始化成功,成功创建一个线性表,目前长度占用%d\n", list->length);
printf("初始化成功,成功创建一个线性表,占用字节数为%zu\n", sizeof(list->Data));
return 0;
}