C-链表的定义、增加和删除

1,链表的理解

一个班级有50名同学,要存储这50名同学的信息,会想到声明一个结构体类型,然后定义一个结构体数组,如果这个结构体数组定义50个成员,如果后续有插班生或者退学的学生,那这个可以存放50个成员的结构体数组就不够用了或者有空间的浪费。

当数据的大小是动态变化的,可以随时增加或删除数据。通过链表就可以应对这样的场景。

2,定义一个链表

以要存储一个班级的学生信息为例:

先定义一个学生信息的结构体类型,结构体成员包括学号、姓名和数学成绩。

struct studentInfo 
{
	int num;
	char name[20];
	int math;
 };

上边可以保存学生信息的结构体类型可以认为是链表元素的数据域。

定义一个学生类型的链表,包括学生信息(数据域)和指向下一个学生类型的指针(指针域)。

struct student
{
	struct studentInfo data;
	struct student* next;
};

 3,链表定义元素

声明完学生类型的链表后,就可以对这个班级的学生进行定义了。

	student st2 = { 2,"张三",100,NULL };
	student st1 = { 1,"李四",90,&st2 };
	student st0;
	st0.next = &st1;
	student* head = &st0;

	printf("%d", head->next->data.math);

定义了两个学生st1、st2,同时定义了一个st0作为链表的头,st0的数据域是空的,指针head指向st0是链表的头指针。head->next指向st1。

4,链表增加元素

可以在链表的头、尾以及中间的任意位置增加元素。

在链表的头增加元素:即将头元素st0的指针域指向增加的元素,将增加元素的指针指向原链表中的第一个元素。

	student st3 = { 3,"王五",80,&st1 };
	head->next = &st3;

	printf("%d\n", head->next->data.math);

此时头元素的指针域就指向了st3。

在链表的尾增加元素:即将原链表的尾元素的指针域(原指向NULL)指向新增加的元素,新增加的元素指针域指向NULL。

	student st4 = { 4,"马六",70,NULL };
	st3.next = &st4;

	printf("%d\n", st3.next->data.math);

在链表阿中将任意位置增加元素:

例如在st1和st2之间新增元素。

	student st5 = { 5,"马六",60,&st2 };
	st1.next = &st5;

	printf("%d\n", st1.next->data.math);

上述的在链表重增加元素是静态增加元素。

也可以动态的为链表增加元素,同时通过封装的函数为链表增加元素,以在链表的头增加元素为例。

void addstuList(student* head, studentInfo data)
{
	student* p = (student*)  malloc(sizeof(student));
	if (p)     // 此处判断p是否为null,是因为如果内存不足malloc可能会返回null
	{
		p->data = data;
		p->next = head->next;
		head->next = p;
	}
	
}
	studentInfo st6Info= { 6,"赵八",50};
	addstuList(head, st6Info);

	printf("%d\n", head->next->data.math);

5,删除链表节点

例如一个学生转学了,根据学号删除这个学生的信息。

void deletestuList(student* head, int num)
{
	student* p = head->next;
	student* pFront = head;

	if (p == NULL)
		printf("链表为空,无法删除\n");
	else
	{
		while (p->data.num != num)
		{
			pFront = p;
			p = p->next;

			if (p == NULL)
			{
				printf("没有找到对应学号学生\n");
				return;
			}
		}
		pFront->next = p->next;
		free(p);
	}
}

 上述代码运行存在问题,还未找到原因。目前看是free函数的问题。

deletestuList(head, 3); //在head链表中删除学号为3的学生

free()函数释放链表中这个元素所占据的内存空间。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值