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

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

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

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

代码如下:

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;
}
相关推荐
Darling噜啦啦4 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠5 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾5 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres8215 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q5 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒5 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
疯狂成瘾者5 天前
Java 集合 LinkedList 详解:链表结构、常用方法和队列使用
java·开发语言·链表
WL学习笔记5 天前
单项不带头不循环链表
数据结构·链表
小糯米6015 天前
JS 数组
数据结构·算法·排序算法
小欣加油5 天前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展