副问题[/!--empirenews.page--]
链表概述
链表是一种常见的重要的数据布局。它是动态地举办存储分派的一种布局。它可以按照必要开发内存单位。链表有一个“头指针”变量,以head暗示,它存放一个地点。该地点指向一个元素。链表中每一个元素称为“结点”,每个结点都应包罗两个部门:一为用户必要用的现实数据,二为下一个结点的地点。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其余元素,它称为“表尾”,它的地点部门放一个“NULL”(暗示“安定点”),链表到此竣事。
链表的衷耘噘纵包罗:进修单向链表的建设、删除、 插入(无序、有序)、输出、 排序(选择、插入、冒泡)、反序等等。
单向链表的图示:
---->[NULL]
head
图1:空链表
---->[p1]---->[p2]...---->[pn]---->[NULL]
head p1->next p2->next pn->next
图2:有N个节点的链表
建设n个节点的链表的函数为:
#include "stdlib.h"
#include "stdio.h"
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
int num; //学号
float score; //分数,其他信息可以继承在下面增进字段
struct student *next; //指向下一节点的指针
};
int n; //节点总数
/*
==========================
成果:建设n个节点的链表
返回:指向链表表头的指针
==========================
*/
struct student *Create()
{
struct student *head; //头节点
struct student *p1 = NULL; //p1生涯建设的新节点的地点
struct student *p2 = NULL; //p2生涯原链表最后一个节点的地点
n = 0; //建设前链表的节点总数为0:空链表
p1 = (struct student *) malloc (LEN); //开发一个新节点
p2 = p1; //假如节点开发乐成,则p2先把它的指针生涯下来以备后用
if(p1==NULL) //节点开发不乐成
{
printf ("nCann't create it,try it again in a moment!n");
return NULL;
}
else //节点开发乐成
{
head = NULL; //开始head指向NULL
printf ("Please input %d node -- num,score: ",n + 1);
scanf ("%d %f",&(p1->num),&(p1->score)); //录入数据
}
while(p1->num != 0) //只要学号不为0,就继承录入下一个节点
{
n += 1; //节点总数增进1个
if(n == 1) //假如节点总数是1,则head指向刚建设的节点p1
{
head = p1;
p2->next = NULL; //此时的p2就是p1,也就是p1->next指向NULL。
}
else
{
p2->next = p1; //指向前次下面方才开发的新节点
}
p2 = p1; //把p1的地点给p2保存,然后p1发生新的节点
p1 = (struct student *) malloc (LEN);
printf ("Please input %d node -- num,&(p1->score));
}
p2->next = NULL; //此句就是按照单向链表的最后一个节点要指向NULL
free(p1); //p1->num为0的时辰跳出了while轮回,而且开释p1
p1 = NULL; //出格不要健忘把开释的变量清空置为NULL,不然就酿成"野指针",即地点不确定的指针
return head; //返回建设链表的头指针
}
输出链表中节点的函数为:
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|