C语言数据结构——链表解决在结构体中的数据存储问题

时间:2021-09-18 11:16:21

       在C语言中常常遇到动态数据存储和处理的情况,通常我们可以通过数组和malloc等函数进行开辟内存进行处理。虽然这种方式可以处理动态数据,但是有一个很明显的缺点就是存在内存泄漏问题。在开辟的内存空间一般比实际存储的空间要大,有时候还会大很多,特别是以2的n次方进行开辟内存时都会造成内存的浪费。为了避免这种缺陷,我们在处理动态数据时也常用链表作为常用的数据结构对数据进行存储。


       背景:结构体在C语言中也很实用,在数据存储中当遇到多个数据作为一组的情形,例如对于一个教师来说,有年龄age,工号code,职位teacher,所教的课程subject,家庭地址等信息。这样这些信息就可以用结构体来表示了。

IDE:vs2013

struct teacher
{
int age;
char code;
char teacher;
char subject;
char address;
}newTeacher;

       当有一个系统需要统计一个学校所有老师属性信息时,就需要对这些信息进行存储,将每个老师都理解成一个节点(node),也就是对结构体内的多个信息元素进行存储,且需要输入一个老师的具体信息(也就是一个结构体的内容)存储一个结构体,不浪费内存空间。在此处用单链表进行处理是比较合适的,模型如下图所示:

C语言数据结构——链表解决在结构体中的数据存储问题
(图片来源:《C程序设计》谭浩强版)

以下是以学生数据结构为例并给出代码演示和实验,创建以下结构体:

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Example)
struct Example
{
int num;
int class;
struct Example *next;//结构体指针作为成员变量
};

       结构体中除了num和class信息外,还有一个结构指针,这个指针是用来取得下一个结构体地址的。这样才能满足链表的条件。

int length;
struct Example *creat(void)//返回一个结构体指针函数
{
struct Example *head;
struct Example *p1, *p2;
length = 0;
p1 = p2 = (struct Example *)malloc(LEN);//同时为p1 p2 开辟内存
printf("Plseae input the num and class:\n");
scanf_s("%d,%d", &p1->num, &p1->class);//输 入结构体成员数据
head = NULL;//防止出现野指针
while (p1->num != 0)//当输入num不为0时 一直输入不停止
{
++length;
if (length == 1)head = p1;
else p2->next = p1;
p2 = p1;
p1 = (struct Example *)malloc(LEN);//继续开辟下一个数据域和指针域
scanf_s("%d,%d", &p1->num, &p1->class);
}
p2->next = NULL;//最后一个指针域
return (head);
}
void main()//思路在于取结构体的指针 然后取得成员变量具体数值
{
struct Example *pt;
pt = creat();
//printf("\nnum:%d\nclass:%d\n", pt->num, pt->class);
for (int i = 0; i < length; i++)
{
printf("\nnum:%d\nclass:%d\n", pt->num, pt->class);
pt=pt->next;
}
system("pause");
}

以下是实验结果:

C语言数据结构——链表解决在结构体中的数据存储问题

       用户由键盘输入学生信息的num,class信息(输入时以,隔开),输入结束的标志是num=0,。当输入0,x时表示录入信息结束。此时打印输出所有学生信息。

*链表在处理结构体中的数据存储时很方便,但是每次开辟的数据域和指针域的地址不一定是连续的,这是与数组处理的不同之处。