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

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

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

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

代码如下:

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;
}
相关推荐
不灭的黄金瞳12310 小时前
C语言手写顺序表
c语言·开发语言·数据结构
qeen8710 小时前
【数据结构】哈希表的C++实现与封装
数据结构·c++·散列表·哈希表
重生之后端学习11 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展
fpcc11 小时前
算法和数据结构—动态规划法
数据结构·算法·动态规划
星星.72214 小时前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法
动词ing14 小时前
【学习笔记】数据结构(数组长度和关键特性+快慢指针+左右指针)
数据结构·笔记·学习
linux-hzh15 小时前
百日算法修炼 · Day 17
数据结构·算法
OPEN-F17 小时前
C++入门教程:数组、字符串与指针入门
数据结构·c++·算法
pluviophile_s17 小时前
数据结构:第7讲:图
数据结构·笔记
林森lsjs17 小时前
零基础吃透二叉树:定义、遍历与高频算法 —数据结构柒
java·开发语言·数据结构·算法·二叉树