数据结构——链表(带有头节点)

之前我们写过的链表基本都是不带头节点的,但是有些算法题,它就要给你来一个带头节点的玩意,我们应该如何写呢?

不带头节点的用的比较多,这里我只写头插和尾插。

那么,我们要带头节点,首先我们就要开辟一个节点出来当头节点,也就是初始化。

代码如下:

c 复制代码
STnode* initlist()
{
	STnode* newnode = (STnode*)malloc(sizeof(STnode));
	if (newnode == NULL)
	{
		printf("error\n");
		exit(-1);
	}
	newnode->next = NULL;
	return newnode;
}

初始化之后我们就是完成尾插,头插,打印函数

创建新节点函数:

c 复制代码
STnode* buynewnode(int val)
{
	STnode* newnode = (STnode*)malloc(sizeof(STnode));
	if (newnode == NULL)
	{
		printf("error\n");
		exit(-1);
	}
	newnode->data = val;
	newnode->next = NULL;
	return newnode;
}

尾插函数:

c 复制代码
void pushback(STnode* phead,int val) {
	STnode* newnode=buynewnode(val);
	STnode* tail = phead;
	while (tail->next!= NULL)
	{
		tail = tail->next;
	}
	tail->next = newnode;
}

头插函数;

c 复制代码
void pushfront(STnode* phead, int val) {
	STnode* newnode = buynewnode(val);
	if (phead->next == NULL)
	{
		pushback(phead, val);
	}
	else {
		STnode* temp = phead->next;
		phead->next = newnode;
		newnode->next = temp;
	}
}

打印函数:

c 复制代码
void Print(STnode* phead)
{
	STnode* tail = phead->next;
	while (tail != NULL)
	{
		printf("%d->", tail->data);
		tail = tail->next;
	}
	printf("NULL\n");
}

测试一下:

完成啦!!

头文件:

c 复制代码
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct link {
	int data;
	struct link* next;
}STnode;
void Print(STnode* phead);
STnode* buynewnode(int val);
void pushback(STnode* phead,int val);
void pushfront(STnode* phead,int val);
STnode* initlist();

函数

c 复制代码
#include"link.h"
STnode* initlist()
{
	STnode* newnode = (STnode*)malloc(sizeof(STnode));
	if (newnode == NULL)
	{
		printf("error\n");
		exit(-1);
	}
	newnode->next = NULL;
	return newnode;
}
STnode* buynewnode(int val)
{
	STnode* newnode = (STnode*)malloc(sizeof(STnode));
	if (newnode == NULL)
	{
		printf("error\n");
		exit(-1);
	}
	newnode->data = val;
	newnode->next = NULL;
	return newnode;
}
void pushback(STnode* phead,int val) {
	STnode* newnode=buynewnode(val);
	STnode* tail = phead;
	while (tail->next!= NULL)
	{
		tail = tail->next;
	}
	tail->next = newnode;
}
void pushfront(STnode* phead, int val) {
	STnode* newnode = buynewnode(val);
	if (phead->next == NULL)
	{
		pushback(phead, val);
	}
	else {
		STnode* temp = phead->next;
		phead->next = newnode;
		newnode->next = temp;
	}
}
void Print(STnode* phead)
{
	STnode* tail = phead->next;
	while (tail != NULL)
	{
		printf("%d->", tail->data);
		tail = tail->next;
	}
	printf("NULL\n");
}

测试:

c 复制代码
#include"link.h"
void test()
{
	STnode* phead= initlist();
	pushfront(phead, 5);
	pushfront(phead, 8);
	pushfront(phead, 9);
	Print(phead);

	pushback(phead, 2);
	pushback(phead, 1);
	pushback(phead, 1);
	Print(phead);
}
int main()
{
	test();
	return 0;
}
相关推荐
Keven_111 小时前
算法札记:二叉树前序、中序、后序遍历及对应序列重要性质
数据结构·算法·深度优先
如此这般英俊1 小时前
手搓Claude Code-第十章 system_prompt
数据结构·人工智能·python·语言模型·自然语言处理·prompt
旖旎夜光2 小时前
LeetCode 738:单调递增的数字(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法
旖旎夜光2 小时前
LeetCode 1262:可被三整除的最大和 (贪心算法)—— 题解
数据结构·c++·算法·leetcode·贪心算法
影视飓风TIM3 小时前
C++ STL 完整入门笔记[9]:C++ 仿函数、priority_queue与STL算法底层笔记
数据结构·c++·笔记
依然鸣4 小时前
蓝桥杯多校模拟赛(第二场)题解
数据结构·c++·经验分享·学习·算法·图论
依然鸣4 小时前
蓝桥杯多校模拟赛 题解
数据结构·c++·经验分享·学习·算法·蓝桥杯
wabs6664 小时前
关于图论【Kruskal算法|卡码网53.寻宝的思考】
数据结构·算法·图论·卡码网
小星星闪亮登场20 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶20 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法