C/C++之链表的建立

个人主页点我进入主页

专栏分类:C语言初阶 C语言程序设计------------KTV C语言小游戏C语言进阶

C语言刷题

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.头插

1.1简介

1.2代码实现头插

1.3分析代码

2.尾插

2.1简介

2.2代码

2.3分析代码


学习了结构体后,我给大家带来一种利用结构体写链表的代码,链表是数据结构之一,其中的数据呈线性排列。在链表中,数据的添加和删除都较为方便,就是访问比较耗费时间**。**链表在以后的数据结构中有很重要的作用,链表的写法分为两种,一种是头插,一种是尾插,这两种不同的写法带来哪些有趣的现象呢?让我们往下看。

1.头插

1.1简介

我们现象想一下,链表就是一些数据通过某种方式进行连接,我们可以大概的画成

1.2代码实现头插

cpp 复制代码
#include <stdlib.h>
#include <stdio.h>
struct ListNode {
    int data;
    struct ListNode* next;
};
struct ListNode*p=NULL,*head=NULL;
struct ListNode* createlist()
{
    int num;
    scanf("%d", &num);
    while (num != -1)
    {
        p = (struct ListNode*)malloc(sizeof(struct ListNode));
        p->data = num;
        p->next = head;
        head = p;
        scanf("%d", &num);
    }
}

1.3分析代码

在这里需要我们先创建一个结构体,它包含数据部分和指针部分,在进行创建链表时我们需要先创建一个struct ListNode类型的指针*p和*head,他们有不同的作用,p是用于创建节点,head是用于节点的链接和记录头结点的位置。具体分析如下:我们先对各个节点进行分配内存,也就是p=(struct ListNode*)malloc(sizeof(struct ListNode)),然后进行数据的初始化,也就是对p中的date进行赋值,让p指向的next指向head,第一次head指向NULL由于我们是头插,需要最后一个节点指向空,我们头插是在节点前创建节点也就是说新的p是头节点,不断改变头节点,我们让head指向p方便了节点的连接和记录头节点的位置。当我们按链表打印数据时是逆序输出。

2.尾插

2.1简介

尾插不同于头插,它相较于头插更难理解,但是进行遍历时是按输入顺序进行打印。

2.2代码

cs 复制代码
#include <stdlib.h>
#include <stdio.h>
struct stud_node {
	int              num;      /*学号*/
	char             name[20]; /*姓名*/
	int              score;    /*成绩*/
	struct stud_node* next;    /*指向下个结点的指针*/
};
struct stud_node* head, * tail;
void input()
{
	struct stud_node* p;
	int nums;
	scanf("%d", &nums);
	head = NULL;
	while (nums != 0)
	{
		p = (struct stud_node*)malloc(sizeof(struct stud_node));
		p->num = nums;
		scanf("%s", p->name);
		scanf("%d", &p->score);
		p->next = NULL;

		if (head == NULL)
		{
			head = p;
			tail = p;
		}
		else
		{
			tail->next = p;
			tail = p;
		}
		scanf("%d", &nums);
	}
}

2.3分析代码

同样需要我们先进行创建结构体,它包含数据部分和指针部分,在进行创建链表时我们需要先创建一个struct ListNode类型的指针*p和*head,以及*tail,他们有不同的作用,p是用于创建节点,head是记录头结点的位置,tail是用于节点的链接。具体分析如下:我们先对各个节点进行分配内存,也就是p=(struct ListNode*)malloc(sizeof(struct ListNode)),然后进行数据的初始化,也就是对p中的date进行赋值,p的next指向空这一步很重要,如果缺少这一步会导致链表的尾节点的next成为野指针,特别注意在进入循环前需要对tail,和head进行初始化,也就是指向空,我们第一次需要让head指向p,tail指向p,然后再此进入循环,这时我们可以画成

这时我们让tail的next指向p然后移动tail让他指向p也就是

这样就完成了链表的连接。

今天的内容就结束了,希望大家可以学会链表的两种建立方式,最后不要忘记一键三连呦。

相关推荐
刚入门的大一新生1 小时前
C++初阶-string类的模拟实现与改进
开发语言·c++
小冯的编程学习之路2 小时前
【软件测试】:推荐一些接口与自动化测试学习练习网站(API测试与自动化学习全攻略)
c++·selenium·测试工具·jmeter·自动化·测试用例·postman
C++ 老炮儿的技术栈3 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
inputA3 小时前
【LwIP源码学习6】UDP部分源码分析
c语言·stm32·单片机·嵌入式硬件·网络协议·学习·udp
猪八戒1.03 小时前
C++ 回调函数和Lambda表达式
c++
源远流长jerry4 小时前
匿名函数lambda、STL与正则表达式
c++
JANYI20184 小时前
嵌入式设计模式基础--C语言的继承封装与多态
java·c语言·设计模式
王RuaRua4 小时前
[数据结构]5. 栈-Stack
linux·数据结构·数据库·链表
tan180°5 小时前
Linux进程信号处理(26)
linux·c++·vscode·后端·信号处理
一只鱼^_5 小时前
牛客练习赛138(首篇万字题解???)
数据结构·c++·算法·贪心算法·动态规划·广度优先·图搜索算法