LinkList.h
#pragma once
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
typedef char LinkType;
typedef struct LinkNode {
LinkType data;
struct LinkNode* next;
} LinkNode;
//1.初始化链表
void LinkListInit(LinkNode** head);
//2.尾插一个元素到链表中
LinkNode* LinkListPushBack(LinkNode** head, LinkType value);
//3.尾删一个元素
void LinkListPopBack(LinkNode** head);
//4.头插一个元素
void LinkListPushFront(LinkNode** head, LinkType value);
//5.头删一个元素
void LinkListPopFront(LinkNode** head);
//6.查找元素在链表中的位置
LinkNode* LinkListFind(LinkNode* head, LinkType to_find);
//7.在pos之前插入元素
void LinkListInsert(LinkNode** head, LinkNode* pos, LinkType value);
//8.在pos之后插入元素
void LinkListInsertAfter(LinkNode** head, LinkNode* pos, LinkType value);
//9.删除指定位置的元素
void LinkListErase(LinkNode** head, LinkNode* pos);
//10.删除指定值的元素
void LinkListRemove(LinkNode** head, LinkType to_delete);
//11.指定值的所有元素都删掉
void LinkListRemoveAll(LinkNode** head, LinkType value);
//12.判定链表为空
int LinkListEmpty(LinkNode* head);
//13.求链表的元素个数
size_t LinkListSize(LinkNode* head);
//14.逆序打印单链表
void LinkListReversePrint(LinkNode* head);
//15.不允许遍历链表, 在pos之前插入
void LinkListInsertBefore(LinkNode** head, LinkNode* pos, LinkType value);
LinkList.c
#include "LinkList.h"
//创建新节点
LinkNode *CreatNewNode(LinkType value)
{
LinkNode *new_node = (LinkNode*)malloc(sizeof(LinkNode));
new_node->data = value;
new_node->next = NULL;
return new_node;
}
//销毁节点
void DestoryNode(LinkNode **Delete)
{
if (Delete == NULL)
{
//非法输入
return;
}
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)
{
*head = CreatNewNode(value);
}
LinkNode *next_node = *head;
LinkNode *new_node = CreatNewNode(value);
*head = new_node;
new_node->next = next_node;
}
//头删一个元素
void LinkListPopFront(LinkNode** head)
{
if (head == NULL)
{
return;
}
if (*head == NULL)
{
return;
}
LinkNode *Delete = *head;
*head = (*head)->next;
DestoryNode(&Delete);
}
//查找元素在链表中的位置
LinkNode* LinkListFind(LinkNode* head, LinkType to_find)
{
if (head == NULL)
{
return;
}
LinkNode *cur = head;
while (cur)
{
if (cur->data == to_find)
{
return cur;
}
cur = cur->next;
}
return 0;
}
//在pos之前插入元素
void LinkListInsert(LinkNode** head, LinkNode* pos, LinkType value)
{
if (head == NULL)
{
return;
}
if (*head == NULL)
{
return;
}
if (pos == NULL)
{
return ;
}
LinkNode *cur = *head;
while (cur)
{
if (pos == (*head))
{
LinkNode *next_node = *head;
LinkNode *new_node = CreatNewNode(value);
*head = new_node;
new_node->next = next_node;
break;
}
if (cur->next == pos)
{
LinkNode *next_node = cur->next;
LinkNode *new_node = CreatNewNode(value);
cur->next = new_node;
new_node->next = next_node;
break;
}
cur = cur->next;
}
}
//在pos之后插入元素
void LinkListInsertAfter(LinkNode** head, LinkNode* pos, LinkType value)
{
if (head == NULL)
{
return;
}
if (*head == NULL)
{
return;
}
if (pos == NULL)
{
return;
}
LinkNode *cur = *head;
while (cur)
{
if (cur == pos)
{
LinkNode *new_node = CreatNewNode(value);
LinkNode *next_node = cur->next;
cur->next = new_node;
new_node->next = next_node;
break;
}
cur = cur->next;
}
}
//删除指定位置的元素
void LinkListErase(LinkNode** head, LinkNode* pos)
{
if (head == NULL)
{
return;
}
if (*head == NULL)
{
return;
}
if (pos == NULL)
{
return;
}
LinkNode *cur = *head;
while(cur)
{
if (pos == (*head))
{
*head = (*head)->next;
DestoryNode(&cur);
break;
}
if (pos == cur->next)
{
LinkNode *Delete = cur->next;
DestoryNode(&Delete);
cur->next = cur->next->next;
break;
}
cur = cur->next;
}
}
//删除指定值的元素
void LinkListRemove(LinkNode** head, LinkType to_delete)
{
if (head == NULL)
{
return;
}
if (*head == NULL)
{
return;
}
LinkNode *cur = *head;
while (cur)
{
if (to_delete == (*head)->data)
{
*head = (*head)->next;
DestoryNode(&cur);
break;
}
if (to_delete == cur->next->data)
{
LinkNode *Delete = cur->next;
cur->next = cur->next->next;
DestoryNode(&Delete);
break;
}
cur= cur->next;
}
}
//指定值的所有元素都删掉
void LinkListRemoveAll(LinkNode** head, LinkType value)
{
if (head == NULL)
{
return;
}
if (*head == NULL)
{
return;
}
LinkNode *cur = *head;
while (cur)
{
if (cur->next->data == value)
{
LinkNode *Delete = cur->next;
cur->next = cur->next->next;
DestoryNode(&Delete);
}
cur = cur->next;
}
}
//判定链表为空
int LinkListEmpty(LinkNode* head)
{
if (head == NULL)
{
return 1;
}
return 0;
}
//求链表的元素个数
size_t LinkListSize(LinkNode* head)
{
if (head == NULL)
{
return 0;
}
size_t size = 0;
LinkNode *cur = head;
while (cur)
{
size++;
cur = cur->next;
}
return size;
}
//逆序打印单链表
void LinkListReversePrint(LinkNode* head)
{
if (head == NULL)
{
return ;
}
LinkNode *cur = head;
LinkNode *new_head = NULL;
while (cur)
{
LinkNode *tmp = cur;
cur = cur->next;
tmp->next = new_head;
new_head = tmp;
}
LinkNode *new_cur = new_head;
while (new_cur)
{
printf("[%c]->", new_cur->data);
new_cur = new_cur->next;
}
printf("NULL\n");
}
//不允许遍历链表, 在pos之前插入
void LinkListInsertBefore(LinkNode** head, LinkNode* pos, LinkType value)
{
if (head == NULL)
{
return;
}
if (pos == NULL)
{
return;
}
LinkNode *new_node = CreatNewNode(pos->data);
LinkNode *cur = pos->next;
pos->next = new_node;
new_node->next = cur;
pos->data = value;
}