#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
//struct node {
// int date;
// struct node *next;
//};
typedef int DateType;
typedef struct ListNode {
DateType data;
struct ListNode *next;
}ListNode;
//初始化/销毁
void Listlnit(ListNode **ppFirst)
{
assert(ppFirst != NULL);
*ppfirst = NULL;
}
void ListDestroy(ListNode **ppFirst)
{
*ppFirst = NULL;
}
//增删查改
static Listnode *CreateNode(DateType date)
{
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
assert(newNode);
newNode->date = date;
newNode->next = NULL;
return newNode;
}
void ListPushFront(ListNode **ppFirst, DataType date)
{
asser(ppFirst != NULL);
//考虑特殊情况,链表为空*ppFirst ==NULL
//正常情况
//1.指针vs 指向空间;从堆上申请空间
ListNode *newNode = CreateNode(date);
newNode->next = *ppFirst;
*ppFirst = newNode;
}
void ListpushBack(ListNode **ppFirst, DateType date) {
ListNode *newNode = CreateNode(date);
特殊情况,找到第一个->至少有一个,所以特殊情况是链表为空
if (*ppFirst == NULL) {
*ppFirst = newNode;
return;
}
//通常情况
ListNode *cur = *ppFirst;
while (cur->next != NULL) {
cur = cur->next;
}
//cur就是最后一个结点
cur->next = newNode;
}
//删除
void ListPopFront(ListNode **ppFirst)
{
asser(ppFirst != NULL);//变量地址不为空
assert(*ppFirst != NULL);//不能是空链表
ListNode *del = *ppFirst;
*ppFirst = del->next;
free(del);
}
void ListPopBack(ListNode **ppFirst)
{
assert(ppFirst != NULL) {
free(*ppFirst);
*ppFirst = NULL;
return;
}
//正常情况
ListNode *del;
ListNode *cur = *ppFirst;
while (cur->next->next != NULL) {
cur = cur->next;
}
del = cur->next;
cur->next = NULL;
free(del);
}
//查找
ListNode *ListFind(ListNode *first, DateType date)
{
//顺序查找, 去遍历
for (ListNode *cur = first;cur != NULL;cur = cur->next)
{
if (date == cur->date) {
return cue;
}
}
retrn NULL;
}
//在结点前插入 (结点pos肯定在链表中&&pos不是空“链表不为空”
void Listlnsert(ListNode **ppFirst, ListNode *pos, DateType date)
{
//头插
if (*ppFirst == pos)
{
ListPushFront(ppFirst, date);
return;
}
ListNode *cur = *ppFirst;
//找pos的前一个结点
while (cur->next != pos) {
cur = cur->next;
}
//插入新结点
ListNode *newNode = CreateNode(date);
//一定要申请空间
newNode->next = cur->next;//pos
cur->next = newNode;
}
//删除指定结点(结点pos坑定在链表中&&pos不是空【链表不是空】
void ListErase(ListNode **ppFirst, ListNode *pos)
{
//头删
if (*ppFirst == pos) {
ListPopFront(ppFirst);
return;//记得return,否则下面加上else
}
LisNode *cur = ppFirst;
//找pos的前一个结点
while (cur->next != pos) {
cur = cur->next;
free(pos);
//记得
}
void Test()
{
ListNode *first;
Listlnit(&first);//传值1.first 传地址 2.&first
//链表是一条空链表,first==NULL;
//first会变化
ListPushBack(&first, 1);
//以后first不变
ListPushBack(&first, 2);
ListPushBack(&first, 3);
ListNode *result = ListFind(find, 2);
Listlnsert(&first, result, 0);
}