#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
typedef int DataType;
typedef struct SListNode {
DataType data;
struct ListNode *pNext;
} SListNode;
void SListInit(SListNode **ppFirst);
SListNode* Create(DataType data);
void print(SListNode** ppFirst);
void SListPushBack(SListNode** ppFirst, DataType data);
void SListPushFront(SListNode **ppFirst, DataType data);
void SListPopFront(SListNode **ppFirst);
void SListInsert(SListNode **ppFirst, SListNode *pPos, DataType data);
void SListErase(SListNode **ppFirst, SListNode *pPos);
void SListRemove(SListNode **ppFirst, DataType data);
void SListRemoveAll(SListNode **ppFirst, DataType data);
void SListDestroy(SListNode **ppFirst);
SListNode *SListFind(SListNode *pFirst, DataType data);
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"LinkList.h"
void SListInit(SListNode **ppFirst)
{
if (ppFirst == NULL)
{
return;
}
*ppFirst = NULL;
}
SListNode* Create(DataType data)
{
SListNode *p = NULL;
p = (SListNode*)malloc(sizeof(SListNode));
p->data = data;
p->pNext = NULL;
return p;
}
void print(SListNode** ppFirst)
{
if (ppFirst == NULL)
{
return;
}
SListNode* flag = *ppFirst;
while (flag->pNext != NULL)
{
printf("%d ", flag->data);
flag = flag->pNext;
}
printf("%d\n", flag->data);
}
void SListPushBack(SListNode** ppFirst, DataType data)
{
if (ppFirst == NULL)
{
return;
}
SListNode *flag = *ppFirst;
if (*ppFirst == NULL)
{
*ppFirst = Create(data);
}
else
{
while (flag->pNext != NULL)
{
flag = flag->pNext;
}
flag->pNext = Create(data);
}
}
void SListPushFront(SListNode **ppFirst, DataType data)
{
if (ppFirst == NULL)
{
return;
}
SListNode *NewNode = Create(data);
NewNode->pNext = *ppFirst;
*ppFirst = NewNode;
}
void SListPopFront(SListNode **ppFirst)
{
if (ppFirst == NULL)
{
return;
}
if (*ppFirst == NULL)
{
return;
}
SListNode *NewNode = *ppFirst;
*ppFirst = (*ppFirst)->pNext;
free(NewNode);
NewNode = NULL;
}
void SListInsert(SListNode **ppFirst, SListNode *pPos, DataType data)
{
if (ppFirst == NULL)
{
return;
}
SListNode *flag = *ppFirst;
SListNode *NewNode = Create(data);
if (*ppFirst == pPos)
{
SListPushFront(ppFirst, data);
}
else
{
while (flag->pNext != pPos)
{
flag = flag->pNext;
if (flag->pNext == NULL)
{
return;
}
}
flag->pNext = NewNode;
NewNode->pNext = pPos;
}
}
void SListErase(SListNode **ppFirst, SListNode *pPos)
{
if (ppFirst == NULL)
{
return;
}
if (*ppFirst == NULL)
{
return;
}
SListNode *flag = *ppFirst;
if (*ppFirst == pPos)
{
SListPopFront(ppFirst);
}
else
{
while (flag->pNext != pPos)
{
flag = flag->pNext;
if (flag->pNext == NULL)
{
return;
}
}
flag->pNext = pPos->pNext;
free(pPos);
pPos = NULL;
}
}
void SListRemove(SListNode **ppFirst, DataType data)
{
if (ppFirst == NULL)
{
return;
}
if (*ppFirst == NULL)
{
return;
}
SListNode *flag = *ppFirst;
SListNode *p = flag->pNext;
if ((*ppFirst)->data == data)
{
SListPopFront(ppFirst);
}
else {
while (p->data != data)
{
flag = flag->pNext;
p = p->pNext;
if (flag->pNext == NULL)
{
return;
}
}
flag->pNext = p->pNext;
free(p);
p = NULL;
}
}
void SListRemoveAll(SListNode **ppFirst, DataType data)
{
if (ppFirst == NULL)
{
return;
}
if (*ppFirst == NULL)
{
return;
}
SListNode *flag = *ppFirst;
SListNode *p = flag->pNext;
if ((*ppFirst)->data == data)
{
SListPopFront(ppFirst);
}
while (p != NULL)
{
if (p->data == data)
{
flag->pNext = p->pNext;
p = p->pNext;
}
else {
flag = flag->pNext;
p = p->pNext;
}
}
free(p);
p = NULL;
}
void SListDestroy(SListNode **ppFirst)
{
if (ppFirst == NULL)
{
return;
}
if ((*ppFirst)->pNext == NULL)
{
return;
}
SListDestroy(&((*ppFirst)->pNext));
free(*ppFirst);
(*ppFirst) = NULL;
}
SListNode *SListFind(SListNode *pFirst, DataType data)
{
if (pFirst == NULL)
{
return NULL;
}
SListNode *flag = pFirst;
do{
flag = flag->pNext;
if (flag->data == data)
{
return flag;
}
} while (flag->pNext != NULL);
return NULL;
}
//初始化测试函数
void TestInit()
{
FUNHEAD;
SListNode *pFirst;
SListInit(&pFirst);
printf("%p\n", pFirst);
}
//尾插测试函数
void TestPushBack()
{
FUNHEAD;
SListNode *pFirst;
SListInit(&pFirst);
SListPushBack(&pFirst, 1);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 5);
SListPushBack(&pFirst, 7);
print(&pFirst);
}
//头插测试函数
void TestPushFront()
{
FUNHEAD;
SListNode *pFirst;
SListInit(&pFirst);
SListPushBack(&pFirst, 1);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 5);
SListPushFront(&pFirst, 7);
print(&pFirst);
}
//头删测试函数
void TestPopFront()
{
FUNHEAD;
SListNode *pFirst;
SListInit(&pFirst);
SListPushBack(&pFirst, 1);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 5);
SListPushBack(&pFirst, 7);
SListPopFront(&pFirst);
print(&pFirst);
}
// 给定结点插入,插入到结点前
void TestInsert()
{
FUNHEAD;
SListNode *pFirst;
SListInit(&pFirst);
SListPushBack(&pFirst, 1);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 5);
SListPushBack(&pFirst, 7);
SListNode *pPos = pFirst->pNext;
SListInsert(&pFirst, pPos, 9);
print(&pFirst);
}
//给定结点删除
void TestErase()
{
FUNHEAD;
SListNode *pFirst;
SListInit(&pFirst);
SListPushBack(&pFirst, 1);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 5);
SListPushBack(&pFirst, 7);
SListNode *pPos = pFirst->pNext;
SListErase(&pFirst, pPos);
print(&pFirst);
}
// 按值删除,只删遇到的第一个
void TestRemove()
{
FUNHEAD;
SListNode *pFirst;
SListInit(&pFirst);
SListPushBack(&pFirst, 1);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 5);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 7);
SListRemove(&pFirst, 3);
print(&pFirst);
}
//按值删除,删除所有的
void TestRemoveAll()
{
FUNHEAD;
SListNode *pFirst;
SListInit(&pFirst);
SListPushBack(&pFirst, 1);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 5);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 7);
SListRemoveAll(&pFirst, 7);
print(&pFirst);
}
//销毁函数测试函数
void TestDestroy()
{
FUNHEAD;
SListNode *pFirst;
SListInit(&pFirst);
SListPushBack(&pFirst, 1);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 5);
SListPushBack(&pFirst, 7);
SListDestroy(&pFirst);
printf("%p\n", pFirst);
}
//查找测试函数
void TestFind()
{
FUNHEAD;
SListNode *pFirst;
SListNode *ret = NULL;
SListInit(&pFirst);
SListPushBack(&pFirst, 1);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 5);
SListPushBack(&pFirst, 7);
ret = SListFind(pFirst, 7);
printf("%p\n", ret);
}
int main()
{
TestInit();
TestPushBack();
TestPushFront();
TestPopFront();
TestInsert();
TestErase();
TestRemove();
TestRemoveAll();
TestDestroy();
TestFind();
system("pause");
return 0;
}