#pragma once
//单向 + 不循环 + 不带头
typedef int SLDateType;
typedef struct SListNode
{
SLDateType date;
struct SLlistNode* next;
} SListNode;
typedef struct SList
{
struct SListNode* first;
} SList;
//初始化
void SListInit(SList* list);
//销毁
void SListDestroy(SList* list);
//头插
void SListPushFront(SList* list, SLDateType date);
//头删
void SListPopFront(SList* list);
//尾插
void SListPushBack(SList* list, SLDateType date);
//尾删
void SListPopBack(SList* list);
//查找
SListNode* SListFind(SList* list, SLDateType date);
//在 pos 这个结点后面插入新结点
void SListInsertAfter(SListNode* pos, SLDateType date);
//删除 pos 这个结点后面的那个结点(pos 不是最后一个结点)
void SListEraseAfter(SListNode* pos);
//删除第一个遇到的date结点
void SListRemove(SList* list, SLDateType date);
//打印
void SListPrint(SList* list);
#include"Slist.h"
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
//初始化
void SListInit(SList* list)
{
assert(list != NULL);
list->first = NULL;
}
//销毁
void SListDestroy(SList* list)
{
SListNode* next = NULL;
assert(list != NULL);
for (SListNode* cur = list->first; cur != NULL; cur = next)
{
next = cur->next;
free(cur);
}
list->first = NULL;
}
//开辟新结点
SListNode* BuyNewNode(SLDateType date)
{
SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode));
assert(NewNode != NULL);
NewNode->date = date;
NewNode->next = NULL;
return NewNode;
}
//头插
void SListPushFront(SList* list, SLDateType date)
{
assert(list != NULL);
SListNode* NewNode = BuyNewNode(date);
NewNode->next = list->first;
list->first = NewNode;
}
//头删
void SListPopFront(SList* list)
{
assert(list != NULL);
assert(list->first != NULL);
SListNode* tmp = list->first->next;
free(list->first);
list->first = tmp;
}
//尾插
void SListPushBack(SList* list, SLDateType date)
{
assert(list != NULL);
if (list->first == NULL)
{
SListPushFront(list, date);
return;
}
SListNode* last = list->first;
while (last->next != NULL)
{
last = last->next;
}
last->next = BuyNewNode(date);
}
//尾删
void SListPopBack(SList* list)
{
assert(list != NULL);
assert(list->first != NULL);
//如果只有一个结点
if (list->first->next == NULL)
{
SListPopFront(list);
return;
}
//如果结点数 >= 2
SListNode* cur = list->first;
SListNode* tmp = cur->next;
for ( ; tmp->next != NULL; cur = cur->next)
{}
free(tmp);
cur->next = NULL;
}
//查找
SListNode* SListFind(SList* list, SLDateType date)
{
assert(list != NULL);
assert(list->first != NULL);
SListNode* tmp = list->first;
while (tmp != NULL)
{
if (tmp->date == date)
{
return tmp;
}
tmp = tmp->next;
}
return NULL;
}
//在 pos 这个结点后面插入新结点
void SListInsertAfter(SListNode* pos, SLDateType date)
{
assert(pos != NULL);
SListNode* NewNode = BuyNewNode(date);
NewNode->next = pos->next;
pos->next = NewNode;
}
//删除 pos 这个结点后面的那个结点(pos 不是最后一个结点)
void SListEraseAfter(SListNode* pos)
{
assert(pos != NULL);
SListNode* tmp = pos->next;
pos->next= tmp->next;
free(tmp);
}
//删除第一个遇到的date结点
void SListRemove(SList* list, SLDateType date)
{
assert(list != NULL);
SListNode* tmp = NULL;
SListNode* cur = list->first;
while (cur != NULL && cur->date != date)
{
tmp = cur;
cur = cur->next;
}
//找完整个链表仍然没有找到
if (cur == NULL)
{
return NULL;
}
//如果第一个就是
if (tmp == NULL)
{
SListPopFront(list);
return;
}
tmp->next = cur->next;
free(cur);
}
//打印
void SListPrint(SList* list)
{
SListNode* node = list->first;
while (node != NULL)
{
printf("%d->", node->date);
}
printf("NULL\n");
}