动态链表、建立与输出

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

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

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

猜你喜欢

转载自blog.csdn.net/wlfyok/article/details/107428443