今天来写一下单链表的增删查改。
先来说一下链表的分类:
链表由特点的不同分为:
(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 =