本文已参与「新人创作礼」活动,一起开启掘金创作之路
定义、静态链表的区别和意义
定义:与静态链表而言,动态列表的大小是变化的,由头节点引入,一个节点有值且指向下一个节点,直到NULL的出现,当然这一过程是指针和结构体共同完成的。 区别和意义:可以动态的定义存储空间的大小,减少资源的浪费。但如果你想找到其中的一个节点所对应的值,只得从头节点开始一个一个地寻找。
动态链表的建立和输出
我们说,动态链表的建立用到两个指针p1和p2,当然这里不算上头指针。
一开始把头指针、p1和p2都指向第一个节点。
之后输入数据,当数据是有效数据或代表链表不结束数据的时候,将p1指向10103,如图(a)所示。之后通过操作p2,使得第一个节点10101的指针指向10103,即p2->next = 10103 ,如图(b)。这里的next就算节点中的指针,它负责记录下一个节点的地址,当是最后一个节点时,它为Null。然后再将p2指向10103,如图(c)。
当记录的节点数据是有意义的时候,就一直重复以上步骤。
当末尾节点数据为结束标志或数据时,我们则将p1所对应的next赋值为Null,这样我们就完成了动态链表的建立。以下是之前讲解的步骤流程图,读者可以大概再缕一缕。
详细代码与结果
这里给大家提供一个比较简单经典的例子,作为例题给读者理解一下。
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct Student)
struct Student
{
long num;
float score;
struct Student *next;
};
int n;
struct Student *creat()
{
struct Student *head;
struct Student *p1,*p2;
n = 0;
p1 = p2 = (struct Student*)malloc(LEN);
scanf("%ld%f",&p1->num,&p1->score);
head = NULL;
while(p1->num != 0)
{
n = n+1;
if(n == 1)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
p1 = (struct Student*)malloc(LEN);
scanf("%ld%f",&p1->num,&p1->score);
}
p2->next = NULL;
return head;
}
void print(struct Student *head)
{
struct Student *p;
printf("\nNOW,These %d records are:\n",n);
p = head;
if(head != NULL)
{
do
{
printf("%ld %5.1lf\n",p->num,p->score);
p = p->next;
}while(p != NULL);
}
}
int main()
{
struct Student *head;
head = creat();
print(head);
return 0;
}
结果如下,成功输出。