【数据结构】带头结点的单链表的头插法

首先要说明几个概念:

  1. 头结点,是单链表的头结点,一般不存储数据,它指向单链表的第一个实际元素。但它不仅仅只是一个普通的结点,它包含了整个链表的结构,也就是包含了所有插入的结点
c 复制代码
#include<stdio.h>
#include<stdlib.h>

typedef struct LNode {
	int data;
	struct LNode *next;	
}LNode *LinkList;

// 头插法建立一个单链表:在单链表的头部插入结点,从而建立一个单链表。
// 参数是一个LinkList类型的引用L,表示链表的头结点 
LinkList head_insert(LinkList &L) {
	LNode *s;
	int x;
	L = (LinkList)malloc(sizeof(LNode));		// 创建头结点,用malloc函数给头结点申请一个存储空间
	L->next=NULL;		// 初始化为空表,由于头结点指向链表的第一个实际元素,所以L->next=NULL,就表示链表为空
	scanf("%d",&x);		// 用scanf函数输入一个整数x,只要x!=9999,就执行循环体 
	while(x!=9999) {
		s=(LNode *)malloc(sizeof(LNode));		// 创建新结点,用malloc函数给新结点分配一个存储空间 
		s->data=x;		// 将输入的x的值赋值给s->data,即s的数据域 
		s->next=L->next;	// 头结点L指向链表的第一个元素,将L的指针指向赋值给s,也就是说现在s指向了链表的第一个元素 
		L->next=s;		// 再将s赋值给L->next,也就是说头结点L指向了s,头结点L只会指向链表的第一个实际元素,所以s现在成为了链表的第一个元素,头插法结束 
		scanf("%d", &x); 
		/**
		* 再用scanf函数输入一个整数x,然后走while的条件判断,
		* 如果true,就接着执行循环体,依次往单链表的头部插入新结点,
		* 每次插入的新结点都成为链表的第一个结点,而原来的结点依次向后移动,
		* 如果false,就返回L 
		*/	
	} 
	return L;		// L虽然只是整个链表的头结点,但它不仅仅是一个普通的结点,它包含了整个链表的结构,也就是包含了所有插入的结点 
}
相关推荐
1-1=01 小时前
C# 数据结构和特殊类型
数据结构·c#·.net·.netcore
希和20271 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
布莱克60512 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
D e re k ZH15 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
zh_xuan20 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
白杨尚青1 天前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
likexuec2 天前
数据结构(2)
数据结构
D e re k ZH2 天前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶2 天前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
十二3 天前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯