链表比顺序表头插节约时间,并且比顺序表更节约空间
game.h
#pragma once
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
typedef int SLTDateType;
typedef struct SListNode
{
SLTDateType data;
struct SListNode* next;
}SListNode;
// 动态申请一个节点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
void SListInsertbefore(SListNode** plist,SListNode* pos, SLTDateType x);
void SListErase(SListNode** phead,SListNode* pos);
void SListInsertAfter(SListNode* pos, SLTDateType x);
void SListEraseAfter(SListNode* pos);
// 单链表的销毁
void SListDestroy(SListNode** plist);
game.c
#include"game.h"
#define _CRT_SECURE_NO_WARNINGS 1
#define k sizeof(int *)
#include<string.h>
SListNode* BuySListNode(SLTDateType x)
{
SListNode* fm = malloc(sizeof(SListNode));
fm->data = x;
fm->next = NULL;
return fm;
}
void SListPrint(SListNode* plist)
{
SListNode* tail = plist;
while (tail != NULL)
{
printf("%d->", tail->data);
tail = tail->next;
}
printf("NULL\n");
}
void SListPushBack(SListNode** pplist, SLTDateType x)
{
assert(pplist);
SListNode* it = BuySListNode(x);
SListNode** tail = pplist;
if (*tail == NULL)
{
*tail = it;
return;
}
SListNode* g = *pplist;
while (g->next != NULL)
g = g->next;
g->next = it;
}
void SListPushFront(SListNode** pplist, SLTDateType x)
{
assert(pplist);
SListNode* i = BuySListNode(x);
SListNode* z = *pplist;
*pplist = i;
i->next = z;
}
void SListPopBack(SListNode** pplist)
{
SListNode** tail = pplist;
assert(pplist);
assert(*pplist);
if ((*tail)->next == NULL)
{
free(*tail);
*tail = NULL;
return;
}
SListNode* organse = *tail;
while (organse->next->next != NULL)
organse = organse->next;
free(organse->next);
organse->next = NULL;
}
void SListPopFront(SListNode** pplist)
{
SListNode** num = pplist;
assert(pplist);
assert(*num);
*num = (*num)->next;
}
SListNode* SListFind(SListNode* plist, SLTDateType x)
{
while (plist != NULL)
{
if (plist->data == x)
return plist;
plist = plist->next;
}
return NULL;
}
void SListInsertbefore(SListNode** plist, SListNode* pos, SLTDateType x)
{
SListNode* o = BuySListNode(x);
assert(plist);
if (*plist == pos)
{
o->next = *plist;
*plist = o;
}
else
{
SListNode* tail = *plist;
while (tail->next!= pos)
tail = tail->next;
o->next = pos;
tail->next = o;
}
}
void SListInsertAfter(SListNode* pos, SLTDateType x)
{
assert(pos);
SListNode* channel = BuySListNode(x);
SListNode* change = pos->next;
pos->next = channel;
channel->next = change;
}
void SListErase(SListNode** phead, SListNode* pos)
{
assert(phead);
assert(pos);
assert(*phead);
if (*phead == pos)
*phead = pos->next;
else
{
SListNode* tail = *phead;
while (tail->next != pos)
tail = tail->next;
tail->next = pos->next;
free(pos);
}
}
void SListEraseAfter(SListNode* pos)
{
assert(pos);
assert(pos->next);
SListNode* ah = pos;
pos->next = pos->next->next;
free(ah);
}
void SListDestroy(SListNode** plist)
{
free(*plist);
*plist = NULL;
}