C 单向链表之动态链表:尾插法

C 单向链表之动态链表:尾插法

尾插法:在尾节点后插入,每插入一个元素,将其作为尾节点。

一、动态链表

静态链表的意义不是很大,主要是因为数据存储在栈上,栈的存储空间有限,不能动态分配。所以链表要实现存储的自由,要动态申请堆里的空间。

二、动态链表的实现

节点和静态链表节点的定义一样:

typedef struct node
{
	int data;             //数据域:存储数据
	struct node * next;   //指针域:指向下一个节点(指向谁,就保存了谁的地址)
}Node;

可将动态链表的结构用如下小火车表示:
在这里插入图片描述

实现代码

创建一个动态链表,输入0结束。

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int data;             //数据域:存储数据
	struct node * next;   //指针域:指向下一个节点(指向谁,就保存了谁的地址)
}Node;
Node * createList();
int main()
{
	Node * head = createList();
	Node * pHead = head;
	pHead = pHead->next;
	while (pHead)
	{
		printf("%d\n",pHead->data);
		pHead = pHead->next;
	}
	return 0;
}
Node * createList()
{
	Node *head = (Node*)malloc(sizeof(Node));
	if(NULL == head)
		exit(-1);
	head->next = NULL;
	Node *tmp = head, *ptr;
	int inputData;
	scanf_s("%d", &inputData);
	while (inputData)
	{
		ptr = (Node*)malloc(sizeof(Node));
		if (NULL == ptr)
			exit(-1);
		ptr->data = inputData;
		tmp->next = ptr;
		tmp = ptr;
		scanf_s("%d", &inputData);
	}
	tmp->next = NULL;
	return head;
}
运行结果:

在这里插入图片描述

三、程序过程图分析

创建列表

Node * head = createList();

1)创建空链表(假设头结点地址为0x10,后面节点地址依次为0x20,0x30…)

	Node *head = (Node*)malloc(sizeof(Node));
	if(NULL == head)
		exit(-1);
	head->next = NULL;

在这里插入图片描述
2)创建尾插法用到的两个指针。指针tmp:指向链表的尾结点(最后一个节点),指针ptr:指向新生成的节点

	Node *tmp = head, *ptr;

在这里插入图片描述
3)输入数据,若输入数据不为零,生成节点,保存数据。

    int inputData;
	scanf_s("%d", &inputData);
	while (inputData)
	{
		ptr = (Node*)malloc(sizeof(Node));
		if (NULL == ptr)
			exit(-1);
		ptr->data = inputData;
	}

在这里插入图片描述
4)尾插法:每次插入节点时,令tmp指向最后一个节点

	    tmp->next = ptr;//(链接)插入新节点
		tmp = ptr;//令tmp指向最后一个节点

在这里插入图片描述
在这里插入图片描述
5)继续输入
①如果输入 inputData==0
跳出循环,返回链表头

	tmp->next = NULL;
	return head;

在这里插入图片描述
②如果输入inputData!=0,ptr指向生成的新节点,保存数据
在这里插入图片描述

 tmp->next = ptr;

在这里插入图片描述

tmp = ptr;

在这里插入图片描述