最简单粗暴的C语言链表详解

单链表分为有头节点和无头节点链表,插入的方法有头接法和尾接法俩种办法,下面,我将使用无头结点的链表,因为尾插法更适合无头结点的链表的插入,所以在此我们使用 1.无头结点链表 2.尾插法插入数据


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#pragma warning(disable:4996)
typedef int DataType;
typedef struct Node
{	
	DataType data;
	struct Node *next;
}Node;
int main()
{
	int i;
	Node *head = NULL, *tail = NULL, *p = NULL;
	for (i = 0; i < 5; i++) {
		p = (Node *)malloc(sizeof(Node));
		p->data = i;
		p->next = NULL;
		if (head == NULL)
			head = p;
		else tail->next = p;
		tail = p;		
	}
	while (head != NULL) {
		printf("%d ", head->data);
		head = head->next;
	}

}

运行结果:
在这里插入图片描述

typedef struct Node
{	
	DataType data;
	struct Node *next;
}Node;

这是链表的结点,包含数据以及指向下一个结点的指针,数据可以是结构体类型,也可以是int,char等各种数据类型

Node *head = NULL, *tail = NULL, *p = NULL;

head是表头,因为是无头结点的链表,所以它既是表头,又是第一个结点
tail 是表尾,我们的尾插法就是在表尾插入数据,
p是我们为了申请内存空间,也就是为了获取结点而使用的局部变量

	for (i = 0; i < 5; i++) {
		p = (Node *)malloc(sizeof(Node));
		p->data = i;
		p->next = NULL;
		if (head == NULL)
			head = p;
		else tail->next = p;
		tail = p;		
	}

此段代码的解析:外层利用for循环,循环五次,插入5个数据
内层:
p = (Node *)malloc(sizeof(Node));申请结点的内存空间
p->data = i;p->next = NULL; 结点赋值
下面是尾插法关键语句:

		if (head == NULL)
			head = p;
		else tail->next = p;
		tail = p;	

当首结点为空时,也就是链表开始时没有任何结点时,插入的时候就直接将head指向第一个结点,然后再将tail表尾指向这个结点。
当首节点不为空时,也就是说链表已经有结点了,那么此时我们将表尾的下一个指向的结点tail->next 指向新申请的结点,然后此时表尾又改变了位置,我们就要重新将表尾指向新的表尾结点位置,即tail = p;

注:链表需要用到指针的知识。因为链表的结点通常我们是需要申请内存空间的,而指针的指向说白了就是指向内存地址,即放这块数据的地址。

我们学链表的时候一般用图来帮助理解
在这里插入图片描述
个人认为这是比较适合初学者的!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值