c语言代码实现
注:函数功能和注释都在代码里
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 3 //链表初始化空间定义
#define INSERT_LIST_SIZE 3 //链表拓展空间定义
//学生结构体
typedef struct
{
int age;
int height;
double weigth;
}Student;
//顺序链表节点类型
typedef struct
{
Student *stu;
int length;
int listsize;
}SqList;
//链表初始化函数
int InitList(SqList *list)
{
//1.申请一个空间
list->stu = (Student*)malloc(sizeof(Student) * LIST_INIT_SIZE);
//2.判断是否拿到空间
if (!list->stu)exit(-1);
//3.如果拿到空间,则初始化
list->length = 0;
list->listsize = LIST_INIT_SIZE;
return 1;
}
//链表删除函数
int DeleteList(SqList *list)
{
//判断是否存在
if (!list->stu)exit(-1);
//释放链表
free(list->stu);
//释放之后,恢复=初始化
list->length = 0;
list->listsize = LIST_INIT_SIZE;
return 1;
}
//遍历链表且打印节点信息函数
void FindList(SqList *list)
{
for (int i = 0; i < list->length; i++)
{
printf("age=%5d,weight=%5lf,height=%5d\r\n", list->stu[i].age, list->stu[i].weigth, list->stu[i].height);
}
}
//查找顺序表中某个元素函数
int FindOneList(SqList* L,Student *stu)
{
int i = 0;
while (i < L->length)
{
if (L->stu[i].age == stu->age && L->stu[i].height == stu->height && L->stu[i].weigth == stu->weigth) return 1;
i++;
}
return 0;
}
//打印成员信息函数
void DisplayValue(Student *stu)
{
if (!stu) return;
printf("age=%5d weigth=%5lf height=%5d\r\n", stu->age, stu->weigth, stu->height);
}
//链表拓展空间函数
int ExtenList(SqList* L)
{
//判断是否为空表
if (!L->stu )exit(-1);
//申请空间
Student* q = (Student*)realloc(L->stu, (L->listsize + INSERT_LIST_SIZE) * sizeof(Student));
//判断是否申请成功
if (!q)exit(-2);
printf("空间申请成功\r\n");
//申请成功,更新顺序表
L->stu = q;
L->listsize += INSERT_LIST_SIZE;
return 1;
}
//复制元素函数
int CopyValue(Student* stu1, Student* stu2)
{
stu1->age = stu2->age;
stu1->height = stu2->height ;
stu1->weigth = stu2->weigth ;
return 1;
}
//在顺序表的尾部插入元素函数
void InsertLastList(SqList *L,Student *stu)
{
//如果顺序表已经满了,则申请空间
if (L->listsize <= L->length)printf("空间申请中\r\n"),ExtenList(L);
//有足够空间,则插入元素
CopyValue(&L->stu[L->length], stu);
//更新顺序表
L->length++;
}
//在顺序表的指定位置插入函数
int InsertLocList(SqList* L, Student* stu, int add)
{
if (L == NULL || stu == NULL)exit(-1);
//判断位置是否合法
if (add >= (L->length - 1) || add < 0) return 0;
//是否有空余空间
if (L->listsize <= L->length) printf("空间申请中\r\n"), ExtenList(L);
//腾出插入的位置
for (int j = L->length; j > add; j--)
{
CopyValue(&L->stu[j],&L->stu [j-1]);
}
//插入元素
CopyValue(&L->stu[add],stu);
//更新表中信息
L->length++;
return 1;
}
int main()
{
//初始化固定用例
SqList L;
Student stu;
//初始化链表
InitList(&L);
//遍历顺序表,并且打印出节点信息
for (int i = 0; i < L.listsize ; i++)
{
printf("输入年龄 体重 身高\r\n");
scanf_s("%d%lf%d",&L.stu[i].age,&L.stu[i].weigth,&L.stu[i].height);
L.length++;
}
//查找指定元素
FindList(&L);
printf("要查找的元素\r\n");
stu.age = 2; stu.height = 2; stu.weigth = 2;
if (FindOneList(&L, &stu) == 1)printf("查找成功\r\n"), DisplayValue(&stu);
else printf("查找失败\r\n");
在链表尾部插入节点
//printf("插入之后的顺序表\r\n");
//InsertLastList(&L,&stu);
//FindList(&L);
//在链表指定位置插入节点
printf("插入位置2之后的顺序表\r\n");
InsertLocList(&L,&stu,1);
FindList(&L);
//释放顺序表的空间
DeleteList(&L);
return 0;
}
总结:
本文只用于学习和记录。