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

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

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

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

代码如下:

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;
}
相关推荐
琢磨先生David4 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode
qq_454245034 天前
基于组件与行为的树状节点系统
数据结构·c#
超级大福宝4 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
岛雨QA4 天前
常用十种算法「Java数据结构与算法学习笔记13」
数据结构·算法
weiabc4 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法
wefg14 天前
【算法】单调栈和单调队列
数据结构·算法
岛雨QA4 天前
图「Java数据结构与算法学习笔记12」
数据结构·算法
czxyvX4 天前
020-C++之unordered容器
数据结构·c++
岛雨QA4 天前
多路查找树「Java数据结构与算法学习笔记11」
数据结构·算法
AKA__Zas4 天前
初识基本排序
java·数据结构·学习方法·排序