【数据结构】单链表的增、删、查、改等

今天来写一下单链表的增删查改。

先来说一下链表的分类:

链表由特点的不同分为:

      (1)单向链表;   (2)双向链表

      (1)不带环;      (2)带环

      (1)不带头结点;(2)带头结点   

三种特点结合,总共有八种链表,其中 [ 单向、不带环、不带头结点 ]链表和 [ 双向、带环、带头结点 ]链表 比较常见。

今天要写的单链表为:单向、不带环、不带头结点的链表。

下面上代码:

linklist.h
#define  _CRT_SECURE_NO_WARNINGS 1
#pragma once
//单向、不带环、不带头结点链表
typedef char LinkNodeType;

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

//把链表头放入结构体
typedef struct LinkList
{
	LinkNode* head;
} LinkList;
//定义一个结构体变量,头结点指针,就表示了整个链表
LinkList list;

//创建新节点
LinkNode * CreateNode(LinkNodeType value);
//销毁节点
void DestroyNode(LinkNode * node);
//创建空链表
LinkNode* LinkListInit(LinkNode **  phead);
//销毁链表
void LinkListDestroy(LinkNode **  phead);
//尾插
void LinkListPushBack(LinkNode ** phead, LinkNodeType value);
//尾删
void LinkListPopBack(LinkNode * phead);
//头插
void LinkListPushFront(LinkNode ** phead, LinkNodeType value);
//头删
void LinkListPopFront(LinkNode ** phead);
//在位置pos之后插入value
void LinkListInsert(LinkNode * pos, LinkNodeType value);
//在pos之前插入value
void LinkListInsertBefore(LinkNode ** phead, LinkNode * pos, LinkNodeType value);
void LinkListInsertBefore2( LinkNode * pos, LinkNodeType value);
//删除指定位置的值
void LinkListErase(LinkNode ** phead, LinkNode * pos);
//找下标
LinkNode *  LinkListFind(LinkNode * head, LinkNodeType to_find);
//删除指定值
void LinkListRemove(LinkNode ** phead, LinkNodeType to_remove);
//删除全部值
void LinkListRemoveAll(LinkNode ** phead, LinkNodeType to_remove);
//判断是否为空链表
int LinkListEmpty(LinkNode * head);
//链表节点数
size_t LinkListSize(LinkNode * head);
//返回第一个节点
LinkNode * LinkListFront(LinkNode * head);
//返回最后一个
LinkNode * LinkListBack(LinkNode * head);
linklist.c
#include <stdio.h>
#include<windows.h>
#include "linklist.h"

#define TESTHEAD printf("================ %s ===============\n",__FUNCTION__)

//创建一个新节点
LinkNode * CreateNode(LinkNodeType value)
{
	LinkNode * new_node = (LinkNode *)malloc(sizeof(LinkNode));//【 结构体的大小??】
	new_node->data = value;
	new_node->next = NULL;
	return new_node;
}

//销毁节点
void DestroyNode(LinkNode * node)
{
	free(node);
}

//创建一个空链表
LinkNode* LinkListInit(LinkNode **  phead)//【 思考这里为啥要定义一个LinkNode** 】
{
	*phead = NULL;
}

//销毁链表
void LinkListDestroy(LinkNode **  phead)
{//TODO
	if (phead == NULL)
	{
		return;
	}
	if (*phead == NULL)
	{
		return;
	}
	LinkNode* cur = *phead;
	while (cur)
	{
		LinkNode * to_delete = cur;
		cur =
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值