C语言 头插法的链表该如何建立 算法是什么? 麻烦各位兄弟讲一下 小弟实在理解不了
发布网友
发布时间:2022-05-03 01:37
我来回答
共1个回答
热心网友
时间:2023-10-03 01:31
链表其实很简单,很容易理解的,只要把它当做循环理解就好了,只不过是一个较为特殊的循环,不要把它想象的太难
首先结构体知道吧,知道就好办,不知道就赶紧复习一下,只有吃透了结构体,才能明白链表,不然链表没法讲
首先定义全局变量 结构体(链表结点的结构体类型,也可以简单的理解所谓结点就是指这个结构体)
案例:输入学生名字和编号
#include "stdio.h"
struct person
{
char *name;
int numbers;
struct person *next;
};
//指针*next起连接作用,是结点和下一个结点的桥梁,必不可少!
在定义 主程序
main()
{
struct person *head,*p1,*p2;
//定义链表操作时的三个指针,*head为头指针;*p1为申请下一个结构体的内存空间(即新的结点),用于存放新的数据;*p2为保存*p1所申请的内存空间(即保存新结点),也就是保存p1中的数据;三个指针缺一不可!
p1=p2=(struct person *)malloc(size);
head=p1;
//malloc函数申请第一个结点,让p1、p2、head共同指向同一个内存空间(即申请的第一个结点)
scanf("%s%d",p1->name,&(p1->numbers));
//向申请的第一个结点输入数据
//下来就该进入循环了
while(p1->numbers !=0)
{
p2=p1;
p2->next=p1;
p1=( struct person *)malloc(size);
scanf("%s%d",p1->name,&(p1->numbers));
}
p2->next=NULL;
//此时就进入了链表的核心算法,得给你好好讲讲!
//循环的判断条件是学生的编号(numbers)不等于0,首先判断第一个结点输入的学生编号是否为0
1.当不为0时,执行循环当中的内容
首先,让p2保存p1申请的结点(即p2=p1)
然后让p2中的next指向p1(即p2->next=p1),在让p1去开辟下个结点
然后用malloc函数申请下一个结点,也就是p1开辟新结点(即p1=(struct person *)malloc(size));在这个新开辟的结点输入数据(即scanf("%s%d",p1->name,&(p1->numbers)));
接着就又进入循环判断条件,满足条件继续进入循环语句,不满足则进入语句2
注意p1、p2、head都指向第一个结点,其中head保存第一个结点,而p1、p2都是相互配合变化的,即p1开辟新结点,p2保存p1开辟的结点,如果循环几次,你就可以发现他们的规律了,
2.当学生编号(numbers)等于0时,退出循环
执行p2->next=NULL;其意思是停止p1开辟新结点(在循环语句里next是指向p1,让p1去开辟新结点)
}
如果你能看懂以上内容,那么链表的输入和链表的删除、插入应该也就很容易明白,若有别的问题QQ留言121590680
如果对你有所帮助,请记得采纳最佳答案,谢谢!