#pragma once
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Node
{
DataType _data; // 数据
struct Node* _next; // 指向下一个节点的指针
}Node, *PLinkList;
//typedef struct Node Node;
//typedef struct Node* PLinkList;
/////////////////////////////////////////////////////////////////////////////////
// 单链表的基本操作
// 初始化/销毁/打印单链表
void InitSList(PLinkList* ppList);
void DestorySList(PLinkList* ppList);
void PrintSList(PLinkList pList);
int GetListLength(PLinkList pList);
// 尾插/尾删/头插/头删
void PushBack(PLinkList* ppList, DataType x);
void PopBack(PLinkList* ppList);
void PushFront(PLinkList* ppList, DataType x);
void PopFront(PLinkList* ppList);
// 查找/删除/插入
Node* Find(PLinkList pList, DataType x);
int Remove(PLinkList* ppList, DataType x);
void Erase(PLinkList* ppList, Node* n);
void Insert(PLinkList* ppList, Node* n, DataType x);
void InitSList(PLinkList* ppList)
{
assert(ppList);
*ppList = 0;
}
void DestorySList(PLinkList* ppList)
{
Node* begin = *ppList;
assert(ppList);
while (begin)
{
Node* tmp = begin;
begin = begin->_next;
free(tmp);
}
*ppList = 0;
}
void PrintSList(PLinkList pList)
{
Node* begin = pList;
printf("PLinkList:");
while (begin)
{
printf("->%d", begin->_data);
begin = begin->_next;
}
printf("->NULL\n");
}
int GetListLength(PLinkList ppList)
{
int length = 0;
Node* begin = ppList;
while (begin)
{
length++;
begin = begin->_next;
}
return length;
}
Node* CreateNode(DataType x)
{
Node* n = (Node*)malloc(sizeof(Node));
n->_data = x;
n->_next = 0;
return n;
}
void PushBack(PLinkList* ppList, DataType x)
{
Node* n = 0;
assert(ppList);
n = CreateNode(x);
// 没有节点/一个以上
if (*ppList == NULL)
{
*ppList = n;
}
else
{
Node* begin = *ppList;
while (begin->_next)
{
begin = begin->_next;
}
begin->_next = n;
}
}
void PopBack(PLinkList* ppList)
{
Node* begin = 0;
assert(ppList);
// 1.没有节点
if (*ppList == 0)
{
return;
}
// 2.一个节点
if ((*ppList)->_next == 0)
{
free(*ppList);
*ppList = 0;
return;
}
// 3.有两个以上的节点
begin = *ppList;
while (begin->_next->_next != NULL)
{
begin = begin->_next;
}
free(begin->_next);
begin->_next = 0;
}
void PushFront(PLinkList* ppList, DataType x)
{
Node* n = 0;
assert(ppList);
n = CreateNode(x);
// 1:没有节点 or 一个以上
if (*ppList == NULL)
{
*ppList = n;
}
else
{
n->_next = *ppList;
*ppList = n;
}
}
void PopFront(PLinkList* ppList)
{
Node* n = 0;
assert(ppList);
// 没有节点
if (*ppList == NULL)
{
return;
}
// 一个节点
if ((*ppList)->_next == NULL)
{
free(*ppList);
*ppList = NULL;
return;
}
// 两个节点以上
n = *ppList;
*ppList = n->_next;
free(n);
}
Node* Find(PLinkList ppList, DataType x)
{
Node* begin = 0;
assert(ppList);
begin = ppList;
while (begin)
{
if (begin->_data == x)
{
return begin;
}
begin = begin->_next;
}
return 0;
}
int Remove(PLinkList* ppList, DataType x)
{
Node* prev = 0;
Node* begin = 0;
Node* del = 0;
assert(ppList);
begin = *ppList;
while (begin)
{
if (begin->_data == x)
{
Node* del = begin;
// 头节点 or 中间节点
if (*ppList == begin)
{
*ppList = (*ppList)->_next;
}
else
{
prev->_next = begin->_next;
}
free(del);
return 0;
}
prev = begin;
begin = begin->_next;
}
return -1;
}
void Insert(PLinkList* ppList, Node* n, DataType x)
{
Node* tmp = 0;
assert(ppList);
tmp = CreateNode(x);
// 没有节点 / 一个以上节点
if (*ppList == NULL)
{
*ppList = tmp;
}
else
{
assert(n);
tmp->_next = n->_next;
n->_next = tmp;
}
}
void Erase(PLinkList* ppList, Node* n)
{
Node* del = 0;
assert(ppList);
assert(n);
// 处理尾节点的情况
if (n->_next == 0)
{
PopBack(ppList);
return;
}
// 将n的下一个next节点的值赋值给n, 删除n的next节点。
n->_data = n->_next->_data;
del = n->_next;
n->_next = n->_next->_next;
free(del);