#pragma once
// 值类型
typedef int DataType;
typedef struct SListNode {
DataType data; // 值
struct SListNode *pNext; // 指向下一个结点
} SListNode;
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
// 初始化
void SListInit(SListNode **ppFirst)
{
assert(ppFirst != NULL);
*ppFirst = NULL;
}
SListNode *NewspanceNode(int data)
{
SListNode *pNewNode = (SListNode*)malloc(sizeof(SListNode));
assert(pNewNode);
pNewNode->data = data;
pNewNode->pNext = NULL;
return pNewNode;
}
// 尾部插入
void SListPushBack(SListNode** ppFirst, DataType data)
{
assert(ppFirst != NULL);
SListNode *pNode = NewspanceNode(data);//能否直接开辟空间
if (*ppFirst == NULL)
{
*ppFirst = pNode;
return;
}
SListNode *pNewNode;
for (pNewNode = *ppFirst; pNewNode->pNext != NULL; pNewNode = pNewNode->pNext)
{
}
pNewNode->pNext = pNode;
}
// 头部插入
void SListPushFront(SListNode **ppFirst, DataType data)
{
assert(ppFirst != NULL);
SListNode *pNode = NewspanceNode(data);
pNode->pNext = *ppFirst;
*ppFirst = pNode;
}
// 尾部删除
void SListPopBack(SListNode **ppFirst)
{
assert(ppFirst != NULL);
assert(*ppFirst != NULL);
if ((*ppFirst)->pNext == NULL)
{
free(*ppFirst);
*ppFirst = NULL;
return;
}
SListNode *pNode;
for (pNode=*ppFirst; pNode->pNext->pNext != NULL; pNode = pNode->pNext)
{
}
free(pNode->pNext);
pNode->pNext = NULL;
}
// 头部删除
void SListPopFront(SListNode **ppFirst)
{
assert(ppFirst != NULL);
assert(*ppFirst != NULL);
SListNode *pNode;
pNode = *ppFirst;
*ppFirst = (*ppFirst)->pNext;
free(pNode);
}
// 给定结点插入,插入到结点前
void SListInsert(SListNode **ppFirst, SListNode *pPos, DataType data)
{
assert(ppFirst != NULL);
assert(*ppFirst != NULL);
SListNode *pNode = *ppFirst;
if (*ppFirst == pPos)
{
SListPushFront(ppFirst,data);
return;
}
SListNode *pNewNode = NewspanceNode(data);
while (pNode->pNext != pPos)
{
pNode = pNode->pNext;
}
pNode->pNext = pNewNode;
pNewNode->pNext = pPos;
}
// 给定结点删除
void SListErase(SListNode **ppFirst, SListNode *pPos)
{
assert(ppFirst!=NULL);
assert(*ppFirst != NULL);
SListNode *pNode;
pNode = *ppFirst;
if (pPos == *ppFirst)
{
SListPopFront(ppFirst);
return;
}
while (pNode->pNext != pPos)
{
pNode = pNode->pNext;
}
pNode->pNext = pPos->pNext;
free(pPos);
}
// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL
int SListFind(SListNode *pFirst, DataType data)
{
SListNode *pNode;
for (pNode = pFirst; pNode; pNode = pNode->pNext)
{
if (pNode->data == data)
{
return pNode;
}
}
return NULL;
}
// 按值删除,只删遇到的第一个
void SListRemove(SListNode **ppFirst, DataType data)
{
assert(ppFirst != NULL);
assert(*ppFirst != NULL);
SListNode *pNode = SListFind(*ppFirst,data);
if (pNode != NULL)
{
SListErase(ppFirst, pNode);
}
}
// 按值删除,删除所有的
void SListRemoveAll(SListNode **ppFirst, DataType data)
{
assert(ppFirst != NULL);
assert(*ppFirst != NULL);
SListNode *pNode = *ppFirst;
SListNode *pCur;
while (pNode->pNext)
{
if (pNode->pNext->data == data)
{
pCur=pNode->pNext;
pNode->pNext = pNode->pNext->pNext;//能否用结点删除
free(pCur);
}
else{
pNode = pNode->pNext;
}
}
if ((*ppFirst)->data == data)
{
SListPopFront(ppFirst);
}
}
// 销毁
void SListDestroy(SListNode **ppFirst)
{
assert(ppFirst!=NULL);
SListNode *pNode, *pNext;
pNode = *ppFirst;
while (pNode != NULL)
{
pNext = pNode->pNext;
free(pNode);
pNode = pNext;
}
*ppFirst = NULL;
}
void print(SListNode *pFirst)
{
SListNode *pNode;
for (pNode = pFirst; pNode; pNode = pNode->pNext)
{
printf("%d -> ", pNode->data);
}
printf("NULL\n");
}
void test()
{
SListNode *pFirst;
SListInit(&pFirst);
assert(pFirst == NULL);
SListPushFront(&pFirst, 1);
SListPushFront(&pFirst, 2);
SListPushFront(&pFirst, 3);
print(pFirst);
SListPushBack(&pFirst, 4);
SListPushFront(&pFirst, 3);
print(pFirst);
SListPopFront(&pFirst);
print(pFirst);
SListPopBack(&pFirst);
print(pFirst);
SListInsert(&pFirst,pFirst->pNext->pNext, 10);
print(pFirst);
SListInsert(&pFirst, pFirst, 12);
print(pFirst);
SListErase(&pFirst, pFirst);
print(pFirst);
SListRemove(&pFirst, 1);
print(pFirst);
SListPushFront(&pFirst, 3);
SListPushFront(&pFirst, 3);
SListPushBack(&pFirst, 3);
SListPushBack(&pFirst, 3);
print(pFirst);
SListRemoveAll(&pFirst, 3);
print(pFirst);
SListDestroy(&pFirst);
}
#include"slist.h"
#include"Interview.h"
int main()
{
//TestMergeOrderedList();
//test3();
//test2();
//test1();
test();
system("pause");
return 0;
}