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

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

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

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

代码如下:

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;
}
相关推荐
二本咕咕-机械转码8 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
D e re k ZH9 小时前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试
La Pulga11 小时前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
番茄味城市甜菜13 小时前
数据结构:双向链表实现,链表与顺序表的对比
数据结构·链表
東隅已逝,桑榆非晚17 小时前
红黑树:从概念到实现
数据结构·c++·笔记·学习
YSL07012418 小时前
一文通关-----树和二叉树
数据结构·算法
小糯米60118 小时前
数据结构 数组与链表 内存与缓存
数据结构
若亦_18 小时前
排序>>交换排序
java·数据结构·算法
努力努力再努力wz18 小时前
【Lua 入门系列】Lua数据结构:从 Table 出发,一文串联数组、链表、栈、队列、集合、映射与树的实现原理
数据结构·链表·lua
漂流瓶jz1 天前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典