SList.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;
typedef struct SListNode
{
struct SListNode *pNext;//指向下一个结点的地址
DataType data;
}SListNode;
SListNode *BuySlistNode(DataType x);//创建新空间和数据
void SListNodePushBack(SListNode **ppHead, DataType data);//后插
void SListNodePushFront(SListNode **ppHead, DataType data);//前插
void SListNodeDelBack(SListNode **ppHead);//尾删
void SListNodeDelFront(SListNode **ppHead);//前删
void SListDestory(SListNode **ppHead);//销毁
SListNode *SListFind(SListNode **ppHead, DataType data);//查找第一个匹配的值,并返回地址
void SListInsert(SListNode **ppHead, SListNode *pos, DataType data);//指定位置插入
void SListErase(SListNode **ppHead, SListNode *pos);//指定位置删除
void SListRemove(SListNode **ppHead, DataType data);//删除第一个匹配的数据
void SListRemoveAll(SListNode **ppHead, DataType data);//删除所有匹配的数据
void SListPrint(SListNode *ppHead);//打印链表
int size(SListNode *ppHead);//链表数据个数
void TestSList();//测试函数
#endif //__SList_H__
SList.c
#include"SList.h"
//创建一个新空间和数据
SListNode *BuySlistNode(DataType x)
{
SListNode*node = (SListNode*)malloc(sizeof(SListNode));
assert(node);
node->data = x;
node->pNext = NULL;
return node;
}
//尾插
void SListNodePushBack(SListNode **ppHead, DataType data)
{
if (*ppHead == NULL)
{
*ppHead = BuySlistNode(data);
return;
}
else
{
SListNode*pNode = *ppHead;
while (pNode->pNext != NULL)
{
pNode = pNode->pNext;
}
pNode->pNext = BuySlistNode(data);
}
}
//头插
void SListNodePushFront(SListNode **ppHead, DataType data)
{
SListNode*pNode = BuySlistNode(data);
pNode->pNext = *ppHead;
*ppHead = pNode;
}
//尾删
void SListNodeDelBack(SListNode **ppHead)
{
//空
if (*ppHead == NULL)
{
return;
}
//一个
else if ((*ppHead)->pNext == NULL)
{
free(*ppHead);
*ppHead = NULL;
}
//多个
else
{
SListNode*prev = NULL; //用两个指针来实现
SListNode*pNode = *ppHead;
while (pNode->pNext != NULL)
{
prev = pNode;
pNode = pNode->pNext;
}
prev->pNext = NULL;
free(pNode);
}
}
void SListNodeDelFront(SListNode **ppHead)
{
if (*ppHead == NULL)
{
return;
}
else
{
SListNode*pNode = (*ppHead)->pNext;//注意*和->优先级的问题
free(*ppHead);
*ppHead = pNode;
}
}
void SListDestory(SListNode **ppHead)
{
SListNode* pNode = *ppHead;
while (pNode)
{
SListNode*pNext = pNode->pNext;//注意释放前需保存下一个指针,防止指针丢失
free(pNode);
pNode = pNext;
}
*ppHead = NULL;
}
SListNode *SListFind(SListNode **ppHead, DataType data)
{
SListNode* pNode = *ppHead;
while (pNode)
{
if (pNode->data == data)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
//指定位置插入
void SListInsert(SListNode **ppHead, SListNode *pos, DataType data)
{
//assert(pos&&(*ppHead));
SListNode*pNode = *ppHead;
SListNode*pNewNode = BuySlistNode(data);
//头插
if (pos == *ppHead)
{
SListNodePushFront(ppHead, data);
}
//中间
else
{
while (pNode->pNext != pos)//注意循环条件
{
pNode = pNode->pNext;
}
pNode->pNext = pNewNode;
pNewNode->pNext = pos;
}
}
//删除指定位置
void SListErase(SListNode **ppHead, SListNode *pos)
{
if (*ppHead == NULL)
{
return;
}
//只有一个,头删
if (pos == *ppHead)
{
SListNodeDelFront(ppHead);
return;
}
SListNode*pNode = *ppHead;
while (pNode->pNext != pos)
{
pNode = pNode->pNext;
}
pNode->pNext = pos->pNext;
free(pos);
pos = NULL;
}
//删除第一个匹配的值
void SListRemove(SListNode **ppHead,DataType data)
{
SListNode*pNode = SListFind(*ppHead,data);
if (pNode != NULL)
{
SListErase(ppHead, pNode);
}
}
//删除所有匹配的值
void SListRemoveAll(SListNode **ppHead, DataType data)
{
if ((*ppHead)->data == data)
{
SListNodeDelFront(ppHead);
}
SListNode *pNode = *ppHead;
SListNode *pDel=NULL;
while (pNode->pNext != NULL)
{
if (pNode->pNext->data == data)
{
pDel = pNode->pNext;
pNode->pNext = pDel->pNext;
free(pDel);
}
else
{
pNode = pNode->pNext;
}
}
}
//打印链表
void SListPrint(SListNode *ppHead)
{
SListNode*pNode = ppHead;
while (pNode)
{
printf("%d->", pNode->data);
pNode = pNode->pNext;
}
printf("NULL\n");
}
//链表的大小
int size(SListNode *ppHead)
{
SListNode*pNode = ppHead;
int size = 0;
while (pNode != NULL)
{
pNode = pNode->pNext;
size++;
}
return size;
}
//测试函数
void TestSList()
{
SListNode *list = NULL;
SListNodePushBack(&list, 1);//注意传地址
SListNodePushBack(&list, 2);
SListNodePushBack(&list, 3);
SListNodePushBack(&list, 4);
SListNodePushBack(&list, 5);
SListPrint(list);
SListNodeDelFront(&list);
SListNodeDelFront(&list);
SListNodeDelFront(&list);
SListNodeDelFront(&list);
SListNodeDelFront(&list);
SListNodeDelFront(&list);
SListPrint(list);
SListNodePushFront(&list, 5);
SListNodePushFront(&list, 2);
SListNodePushFront(&list, 4);
SListNodePushFront(&list, 1);
SListNodePushFront(&list, 5);
SListNodePushFront(&list, 7);
SListPrint(list);
SListNodeDelBack(&list);
SListNodeDelBack(&list);
SListNodeDelBack(&list);
SListNodeDelBack(&list);
SListNodeDelBack(&list);
SListNodeDelBack(&list);
SListPrint(list);
SListNodePushFront(&list, 5);
SListNodePushFront(&list, 2);
SListNodePushFront(&list, 4);
SListNodePushFront(&list, 1);
SListNodePushFront(&list, 5);
SListNodePushFront(&list, 7);
SListPrint(list);
SListDestory(&list);
SListPrint(list);
SListNodePushFront(&list, 5);
SListNodePushFront(&list, 1);
SListNodePushFront(&list, 4);
SListNodePushFront(&list, 1);
SListNodePushFront(&list, 5);
SListNodePushFront(&list, 7);
SListPrint(list);
SListNode*pos;
pos = SListFind(&list, 4);
SListInsert(&list, pos, 0);
SListPrint(list);
pos = SListFind(&list, 4);
SListErase(&list, 4);
SListPrint(list);
printf("%d\n", size(list));
SListRemove(&list,1);
SListPrint(list);
SListRemoveAll(&list, 1);
SListPrint(list);
Destroy(&list);
SListPrint(list);
}
test.c
#include "SList.h"
int main()
{
TestSList();
system("pause");
return 0;
}