链表
slist.h
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
// slist.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);
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
void SListEraseAfter(SListNode* pos);
// 单链表的销毁
void SListDestory(SListNode** plist);
slist.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "slist.h"
SListNode* BuySListNode(SLTDateType x)
{
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
if (newnode == NULL)
{
printf("failed");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
return newnode;
}
void SListPrint(SListNode* plist)
{
SListNode* cur = plist;
while (cur!=NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
void SListPushBack(SListNode** pplist, SLTDateType x)
{
SListNode* newnode = BuySListNode(x);
if (*pplist == NULL)
{
*pplist = newnode;
}
else
{
SListNode* tail = *pplist;
while (tail->next)
{
tail = tail->next;
}
tail->next = newnode;
}
}
void SListPushFront(SListNode** pplist, SLTDateType x)
{
SListNode* newnode = BuySListNode(x);
newnode->next = *pplist;
*pplist = newnode;
}
void SListPopBack(SListNode** pplist)
{
assert(*pplist != NULL);
SListNode* tail = *pplist;
if ((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
SListNode* prev = NULL;
while (tail->next != NULL)
{
prev = tail;
tail = tail->next;
}
prev->next = NULL;
free(tail);
tail = NULL;
}
}
void SListPopFront(SListNode** pplist)
{
SListNode* head = *pplist;
*pplist = head->next;
free(head);
head = NULL;
}
SListNode* SListFind(SListNode* plist, SLTDateType x)
{
SListNode* cur = plist;
while (cur->next != NULL)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void SListInsertAfter(SListNode* pos, SLTDateType x)
{
SListNode* newnode = BuySListNode(x);
newnode->next = pos->next;
pos->next = newnode;
}
void SListErase(SListNode** pplist, SListNode* pos)
{
if(*pplist == pos)
{
*pplist = pos->next;
free(pos);
}
else
{
SListNode* prev = *pplist;
while(prev->next != pos)
{
prev = prev->net;
}
prev->next = pos->next;
free(pos);
}
}
void SListEraseAfter(SListNode* pos)
{
assert(pos->next);
STlistNode* next = pos->next;
pos->next = next->next;
free(next);
}
void SListDestory(SListNode** pplist)
{
assert(plist);
SListNode* cur = *pplist;
while(cur)
{
SListNode* next = cur->next;
free(cur);
cur=next;
}
*pplist = NULL;
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "slist.h"
//void SListPopFront(SListNode** pplist)
//{
// assert(*pplist != NULL);
// SListNode* head = *pplist;
// *pplist = (*pplist)->next;
// free(head);
// head = NULL;
//}
void test1()
{
SListNode *D1 = NULL;
SListPushBack(&D1, 1);
SListPushBack(&D1, 2);
SListPushBack(&D1, 3);
SListPushBack(&D1, 4);
SListPrint(D1);
SListPushFront(&D1, 1);
SListPushFront(&D1, 2);
SListPushFront(&D1, 3);
SListPushFront(&D1, 4);
SListPrint(D1);
//SListPopBack(&D1);
//SListPopBack(&D1);
//SListPopBack(&D1);
//SListPopBack(&D1);
//SListPopBack(&D1);
//SListPopBack(&D1);
//SListPopBack(&D1);
//SListPopBack(&D1);
//SListPopFront(&D1);
//SListPopFront(&D1);
//SListPopFront(&D1);
//SListPopFront(&D1);
//SListPopFront(&D1);
//SListPopFront(&D1);
//SListPopFront(&D1);
//SListPopFront(&D1);
SListPrint(D1);
printf("%d,%d\n",2,SListFind(D1, 2)->data);
SListInsertAfter(SListFind(D1, 2), 9);
SListPrint(D1);
SListEraseAfter(SListFind(D1, 2));
SListPrint(D1);
}
int main()
{
test1();
return 0;
}