关于链表的增删改查~
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int DataType;
typedef struct SListNode
{
DataType data;
struct SListNode *pNext;
}SListNode;
//初始化
void SListInit(SListNode **ppFirst)
{
assert(ppFirst!=NULL);
*ppFirst = NULL;
}
//销毁
void SListDestroy(SListNode **ppFirst)
{
assert(ppFirst!=NULL);
SListNode *pNode, *pNext;
pNode = *ppFirst;
while (pNode!=NULL)
{
pNext = pNode->pNext;
free(pNode);
pNode = pNext;
}
*ppFirst = NULL;
}
//申请空间
SListNode *CreateNewNode(int data)
{
SListNode *NewNode = (SListNode *)malloc(sizeof(SListNode));
assert(NewNode);
NewNode->data = data;
NewNode->pNext = NULL;
return NewNode;
}
//尾插
void PushBack(SListNode **ppFirst, DataType data)
{
assert(ppFirst);
//1.申请空间
SListNode *pNewNode = CreateNewNode(data);
//2.
if (*ppFirst == NULL)
{
*ppFirst = pNewNode;
return;
}
SListNode *pNode = *ppFirst;
while (pNode->pNext!=NULL)
{
pNode = pNode->pNext;
}
pNode->pNext = pNewNode;
}
//头插
void PushFront(SListNode **ppFirst, int data)
{
assert(ppFirst);
SListNode *pNewNode = CreateNewNode(data);
pNewNode->pNext = *ppFirst;
*ppFirst = pNewNode;
}
//头删
void PopFront(SListNode **ppFirst)
{
assert(ppFirst);
assert(*ppFirst);
SListNode *poldFirst = *ppFirst;
*ppFirst = (*ppFirst)->pNext;
free(poldFirst);
}
//尾删
void PopBack(SListNode **ppFirst)
{
assert(ppFirst);
assert(*ppFirst);
while ((*ppFirst)->pNext == NULL)
{
free(*ppFirst);
*ppFirst = NULL;
return;
}
SListNode *pNode=*ppFirst;
while (pNode->pNext->pNext != NULL)
{
pNode = pNode->pNext;
}
free (pNode->pNext);
pNode->pNext = NULL;
}
//查找
SListNode *Find(SListNode *pFirst, int data)
{
SListNode *pNode;
for (pNode = pFirst; pNode; pNode=pNode->pNext)
{
if (pNode->data == data)
{
return pNode;
}
}
return NULL;
}
//按节点插入
void Insert(SListNode **ppFirst, SListNode *pPos, DataType data)
{
assert(ppFirst);
SListNode *pNode = *ppFirst;
if ( pPos==*ppFirst)
{
PushFront(ppFirst, data);
return;
}
while (pNode->pNext != pPos)
{
pNode = pNode->pNext;
}
SListNode *pNewNode = CreateNewNode(data);
pNode->pNext = pNewNode;
pNewNode->pNext = pPos;
}
//按节点删除
void Erase(SListNode **ppFirst,SListNode *pPos)
{
assert(ppFirst);
assert(*ppFirst);
//SListNode *pNode = *ppFirst;
if (pPos == *ppFirst)
{
PopFront(ppFirst);
return;
}
SListNode *pCur;
for (pCur = *ppFirst; pCur != pPos; pCur = pCur->pNext)
{
}
pCur->pNext = pPos->pNext;
free(pPos);
}
//删除第一次遇见的
void Remove(SListNode **ppFirst, DataType data)
{
SListNode *pFound = Find(*ppFirst, data);
if (pFound != NULL) {
Erase(ppFirst, pFound);
}
}
//删除所有出现的
void RemoveAll(SListNode **ppFirst, DataType data)
{
SListNode *pNode = *ppFirst;
SListNode *pNext;
while (pNode->pNext) {
if (pNode->pNext->data == data) {
pNext = pNode->pNext;
pNode->pNext = pNode->pNext->pNext;
free(pNext);
}
else {
pNode = pNode->pNext;
}
}
if ((*ppFirst)->data == data) {
PopFront(ppFirst);
}
}
//打印
void print(SListNode *pFirst)
{
SListNode *pNode;
for (pNode = pFirst; pNode; pNode=pNode->pNext)
{
printf("%d-> ", pNode->data);
}
printf("NULL\n");
}
void SList()
{
SListNode *pFirst;
//初始化
SListInit(&pFirst);
//尾插
PushBack(&pFirst, 1);
PushBack(&pFirst, 2);
PushBack(&pFirst, 3);
PushBack(&pFirst, 6);
print(pFirst);
//头插
PushFront(&pFirst, 3);
PushFront(&pFirst, 14);
PushFront(&pFirst, 3);
print(pFirst);
//头删
PopFront(&pFirst);
print(pFirst);
//尾删
PopBack(&pFirst);
print(pFirst);
//查找
SListNode *pFound = Find(pFirst, 3);
if (pFound == NULL)
{
printf("没找到!");
}
else
{
printf("%d\n ", pFound->data);
Insert(&pFirst, pFound, 16);
Erase(&pFirst, pFound);
}
print(pFirst);
//根据数据删除
//Remove(&pFirst, 3);
RemoveAll(&pFirst, 3);
print(pFirst);
//销毁
SListDestroy(&pFirst);
}