动态链表、建立与输出

82 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

定义、静态链表的区别和意义

定义:与静态链表而言,动态列表的大小是变化的,由头节点引入,一个节点有值且指向下一个节点,直到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;
}

结果如下,成功输出。 在这里插入图片描述