头文件:SList.h
#pragma once
#include<stdio.h>
#define N 100
// 值类型
typedef int DataType;
typedef struct SListNode {
DataType data; // 值
struct SListNode *pNext; // 指向下一个结点
int Size;
} SListNode;
//SListNode *head;
// 初始化
void SListInit(SListNode **ppFirst);
//Size
int Size(SListNode **ppFirst);
// 尾部插入
void SListPushBack(SListNode** ppFirst, DataType data);
// 头部插入
void SListPushFront(SListNode **ppFirst, DataType data);
// 尾部删除
void SListPopBack(SListNode **ppFirst);
// 头部删除
void SListPopFront(SListNode **ppFirst);
// 给定结点插入,插入到结点前
void SListInsert1(SListNode **ppFirst, SListNode *pPos, DataType data);
void SListInsert2(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);
// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL
SListNode* SListFind(SListNode *pFirst, DataType data);
//type
void Print(SListNode *pHead);
功能函数:SList.c:
#include"Slist.h"
#include<stdlib.h>
#include<assert.h>
// 初始化
void SListInit(SListNode **ppFirst){
*ppFirst = NULL;
}
//创建新节点
static SListNode *BuyNewNode(DataType data)
{
SListNode *pNewNode = (SListNode *)malloc(sizeof(SListNode));
assert(pNewNode);
pNewNode->data = data;
pNewNode->pNext = NULL;
return pNewNode;
}
//Erase
void Erase(SListNode **ppFirst, SListNode *pPos)
{
if (*ppFirst == pPos){
SListPopFront(ppFirst);
return;
}
SListNode* pNode;
for (pNode = *ppFirst; pNode->pNext != pPos; pNode = pNode->pNext){}
pNode->pNext = pPos->pNext;
free(pPos);
}
//Size
int Size(SListNode **ppFirst)
{
int Size = 0;
SListNode *pNode;
for (pNode = *ppFirst; pNode != NULL; pNode = pNode->pNext){
Size++;
}
return Size;
}
// 尾部插入
void SListPushBack(SListNode** ppFirst, DataType data)
{
SListNode *pNewNode = BuyNewNode(data);
if (*ppFirst == NULL){
*ppFirst = pNewNode;
return;
}
SListNode *pNode = *ppFirst;
while (pNode->pNext != NULL) {
pNode = pNode->pNext;
}
pNewNode->pNext = pNode->pNext;
pNode->pNext = pNewNode;
}
// 头部插入
void SListPushFront(SListNode **ppFirst, DataType data){
SListNode *PNewNode = BuyNewNode(data);
PNewNode->pNext = *ppFirst;
*ppFirst = PNewNode;
}
// 尾部删除
void SListPopBack(SListNode **ppFirst)
{
if (*ppFirst = NULL){
return;
}
if ((*ppFirst)->pNext == NULL) {
free(*ppFirst);
*ppFirst = NULL;
return;
}
SListNode *pNode, *pNext;
pNode = *ppFirst;
while (pNode->pNext->pNext != NULL) {
pNode = pNode->pNext;
}
pNext = pNode->pNext;
pNode->pNext = pNext->pNext;
//pNode->pNext = NULL;
free(pNext);
}
// 头部删除
void SListPopFront(SListNode **ppFirst)
{
if (*ppFirst == NULL){
return;
}
else{
SListNode *pHead = *ppFirst;
SListNode *pNext = pHead->pNext;
free(pHead);
*ppFirst = pNext;
}
}
// 给定结点插入,插入到结点前
void SListInsert1(SListNode **ppFirst, SListNode *pPos, DataType data)
{
if (*ppFirst == pPos){
SListPushFront(ppFirst, data);
return;
}
SListNode *pNode;
for (pNode = *ppFirst; pNode->pNext != pPos; pNode = pNode->pNext){
}
SListNode *pNewNode = BuyNewNode(data);
pNewNode->pNext = pPos;
pNode->pNext = pNewNode;
}
void SListInsert2(SListNode **ppFirst, SListNode *pPos, DataType data)
{
}
// 给定结点删除
void SListErase(SListNode **ppFirst, SListNode *pPos)
{
if (*ppFirst == pPos){
SListPopFront(ppFirst);
return;
}
SListNode *pNode;
for (pNode = *ppFirst; pNode->pNext != pPos; pNode = pNode->pNext){}
pNode->pNext = pPos->pNext;
free(pPos);
}
// 按值删除,只删遇到的第一个
void SListRemove(SListNode **ppFirst, DataType data)
{
SListNode *pPos = SListFind(*ppFirst, data);
if (pPos != NULL){
Erase(ppFirst, pPos);
}
}
// 按值删除,删除所有的
void SListRemoveAll(SListNode **ppFirst, DataType data)
{
SListNode *pNode = *ppFirst;
SListNode *pDel;
while (pNode->pNext != NULL){
if (pNode->pNext->data==data){
pDel = pNode->pNext;
pNode->pNext = pDel->pNext;
free(pDel);
}
else{
pNode = pNode->pNext;
}
}
if ((*ppFirst)->data == data){
SListPopFront(ppFirst);
}
}
// 销毁
void SListDestroy(SListNode **ppFirst)
{
SListNode *pNode, *pNext;
for (pNode = *ppFirst; pNode != NULL; pNode = pNext){
pNext = pNode->pNext;
free(pNode);
}
*ppFirst = NULL;
}
// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL
SListNode* SListFind(SListNode *pFirst, DataType data)
{
SListNode *pNode;
for (pNode = pFirst; pNode != NULL; pNode = pNode->pNext){
if (pNode->data == data){
return pNode;
}
}
return NULL;
}
//type
void Print(SListNode *ppFirst)
{
SListNode *pNode;
for (pNode = ppFirst; pNode != NULL; pNode = pNode->pNext) {
printf("%2d -> ", pNode->data);
}
}
测试用例:main.c
#include"Slist.h"
#include<stdlib.h>
int main(){
SListNode *ppFirst;
SListNode *pPos=NULL;
SListNode *ret=NULL;
SListInit(&ppFirst);
SListPushBack(&ppFirst, 1);
SListPushBack(&ppFirst, 2);
SListPushBack(&ppFirst, 1);
SListPushBack(&ppFirst, 4);
SListPushBack(&ppFirst, 1);
SListPushBack(&ppFirst, 9);
SListPushBack(&ppFirst, 1);
Print(ppFirst); printf("\n");
SListPushFront(&ppFirst, 5);
SListPushFront(&ppFirst, 6);
SListPushFront(&ppFirst, 7);
Print(ppFirst); printf("\n");
SListPopFront(&ppFirst);
Print(ppFirst); printf("\n");
//SListPopBack(&ppFirst);
//Print(ppFirst); printf("\n");
//SListErase(&ppFirst,2);
SListFind(ppFirst, 2);
printf("find address:a->%p\n", ret);
SListRemove(&ppFirst,5);
Print(ppFirst); printf("\n");
SListRemoveAll(&ppFirst, 1);
Print(ppFirst);printf("\n");
system("pause");
return 0;
}