【数据结构】C语言实现无头节点单链表

本文详细介绍了如何使用C语言来实现无头节点的单链表,包括链表的基本操作如插入、删除、遍历等,是理解数据结构中链表概念的重要实践。
摘要由CSDN通过智能技术生成

LinkList.h

#pragma once

#include<stdio.h>
#include<stddef.h>

typedef char LinkType;

typedef struct LinkNode{
	LinkType data;
	struct LinkNode* next;
}LinkNode;

//初始化
void LinkListInit(LinkNode** head);
//创建一个新结点
LinkNode* CreatNewNode(LinkType value);
//尾插
LinkNode* LinkListPushBack(LinkNode** head, LinkType value);
//尾删
void LinkListPopBack(LinkNode** head);
//头插
void LinkListPushFront(LinkNode** head, LinkType value);
//头删
void LinkListPopFront(LinkNode** head);
//查找元素在链表中的位置
LinkNode* LinkListFind(LinkNode* head, LinkType to_find);
//在pos之前插入元素
void LinkListInsert(LinkNode** head, LinkNode* pos, LinkType value);
//在pos之后插入元素
void LinkListInsertAfter(LinkNode** head, LinkNode* pos, LinkType value);
//删除指定位置的元素
void LinkListErase(LinkNode** head, LinkNode* pos);
//删除指定值的元素
void LinkListRemove(LinkNode** head, LinkType to_delete);
//删除指定值的所有元素
void LinkListRemoveAll(LinkNode** head, LinkType to_delete);
//判断链表为空
int LinkListEmpty(LinkNode* head);
//求链表元素个数
size_t LinkListSize(LinkNode* head);
//逆序打印单链表
void LinkListReversePrint(LinkNode** head);
//不允许遍历链表,在pos位置之前插入一个元素
void LinkListInsertBefore(LinkNode* head, LinkNode* pos, LinkType value);






LinkList.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"LinkList.h"
#include<stdlib.h>

LinkNode* CreatNewNode(LinkType value) {

	LinkNode* NewNode = (LinkNode*)malloc(sizeof(LinkNode));
	NewNode->data = value;
	NewNode->next = NULL;
	return NewNode;

}

void DestoryNode(LinkNode** Delete) {
	if (Delete == NULL) {
		return;
	}
	free(*Delete);
}

void LinkListInit(LinkNode** head) {
	if (head == NULL) {
		//非法输入
		return;
	}
	if ((*head) == NULL) {
		//空链表
		return;
	}
	(*head) = NULL;
}
LinkNode* LinkListPushBack(LinkNode** head, LinkType value) {
	if (head == NULL) {
		//非法输入
		return;
	}
	if ((*head) == NULL) {
		//空链表
		(*head) = CreatNewNode(value);
	}
	//链表不为空链表,直接遍历一遍
	else {
		LinkNode* begin = *head;
		while (begin->next) {
			begin = begin->next;
		}
		begin->next = CreatNewNode(value);
	}
}
void LinkListPopBack(LinkNode** head) {
	if (head == NULL) {
		return;
	}
	if (*head == NULL) {
		//空链表
		return;
	}
	LinkNode* pop = *head;
	while (pop->next->next){
		pop = pop->next;
	}
	LinkNode* Delete = pop->next;
	DestoryNode(&Delete);
	pop->next = NULL;
}

void LinkListPushFront(LinkNode** head, LinkType value) {
	if (head == NULL) {
		return;
	}
	if (*head == NULL) {
		//空链表
		LinkNode* NewNode = CreatNewNode(value);
		*(head) = NewNode;
	}
	else{
		LinkNode* NewNode = CreatNewNode(value);
		LinkNode* NextNode = (*head);
		(*head) = NewNode;
		NewNode->next = Ne
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值