在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程序设计》谭浩强版)
以下是以学生数据结构为例并给出代码演示和实验,创建以下结构体:
#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");
}