LinkList.h
#pragma once
typedef int SDataType;
//链表节点
typedef struct SListNode {
SDataType _data;
struct SListNode* _PNext;
}Node,*PNode;
typedef struct SList { //封装链表结构,类似于头节点
PNode _pHead;//指向链表的第一个节点
} Slist;
void SListInit(SList *s);//初始化链表
void SListPushBack(SList* s, SDataType data);//在链表表尾部插入数据
void SListPopBack(SList* s);//删除链表最后一个节点
void SListPushFront(SList* s, SDataType data);//链表首部插入数据
void SListPopFront(SList* s);//删除链表第一个节点
void SListInsert(PNode pos, SDataType data);//在链表pos位置后插入数据
void SListErase(SList* s, PNode pos);//删除链表s中pos位置的节点
PNode SListFind(SList* s, SDataType data);//在链表s中查找数据data,查询成功返回指针,失败返回NULL
void SListRemove(SList* s, SDataType data);//移除链表中第一个值为data的元素
int SListSize(SList* s);//获取链表s的长度
int SListEmpty(SList* s);//检测链表是否为空
void SListClear(SList* s);//将链表中有效节点清空
void SListDestroy(SList* s);//销毁链表
void SListPrint(SList* s);//打印链表
LinkList.cpp
// LinkList.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include "LinkList.h"
PNode BuySListNode(SDataType data) {
Node* pNode = (Node*)malloc(sizeof(Node));
pNode->_data = data;
pNode->_PNext = NULL;
return pNode;
}
void SListInit(SList* s) {
//初始化链表
assert(s);
s->_pHead=BuySListNode(NULL);
}
void SListPushBack(SList* s, SDataType data) {
//在链表表尾部插入数据
//创建节点
PNode pNewNode = BuySListNode(data);
PNode pCur = s->_pHead;
while (pCur->_PNext)
{
pCur = pCur->_PNext;
}
//最后一个节点指向新节点
pCur->_PNext = pNewNode;
}
void SListPopBack(SList* s){
//删除链表最后一个节点
PNode pPre = s->_pHead;
PNode pCur=pPre->_PNext;
while (pCur->_PNext)
{
pPre = pCur;
pCur = pCur->_PNext;
}
free(pCur);
pPre->_PNext = NULL;
}
void SListPushFront(SList* s, SDataType data) {
//链表首部插入数据
PNode pNewNode = BuySListNode(data);
pNewNode->_PNext = s->_pHead->_PNext;
s->_pHead->_PNext = pNewNode;
}
void SListPopFront(SList* s){
//删除链表第一个节点
PNode pHead = s->_pHead;
if (pHead) {//如果存在首节点
PNode pFir = pHead->_PNext;
PNode pSec = pFir->_PNext;
pHead->_PNext = pSec;
free(pFir);
}
}void SListInsert(PNode pos, SDataType data) {
//在链表pos位置后插入数据
if (!pos) {
return;
}
PNode pNew = BuySListNode(data);
pNew->_PNext = pos->_PNext;
pos->_PNext = pNew;
}
void SListErase(SList* s, PNode pos) {
//删除链表s中pos位置的节点
PNode pPre = s->_pHead;
PNode pCur = pPre->_PNext;
while (pCur&&pos!=pCur)
{
pPre = pCur;
pCur = pCur->_PNext;
}
if (pCur) {
pPre->_PNext = pCur->_PNext;
free(pCur);
pos = NULL;
}
}
PNode SListFind(SList* s, SDataType data) {
//在链表s中查找数据data,查询成功返回指针,失败返回NULL
PNode pPre = s->_pHead;
PNode pCur = pPre->_PNext;
while (pCur&&pCur->_data!=data)
{
pPre = pCur;
pCur = pCur->_PNext;
}
if (pCur) {
return pPre->_PNext;
}
return NULL;
}
void SListRemove(SList* s, SDataType data) {
//移除链表中第一个值为data的元素
PNode pPre = s->_pHead;
PNode pCur = pPre->_PNext;
while (pCur && pCur->_data != data)
{
pPre = pCur;
pCur = pCur->_PNext;
}
if (pCur) {
pPre->_PNext = pCur->_PNext;
free(pCur);
}
}
int SListSize(SList* s) {
//获取链表s的长度
int count = 0;
PNode pCur = s->_pHead;
while (pCur->_PNext)
{
++count;
pCur = pCur->_PNext;
}
return count;
}int SListEmpty(SList* s) {
//检测链表是否为空
return s->_pHead->_PNext == NULL ? 1 : 0;
}
void SListClear(SList* s) {
//将链表中有效节点清空
while (!SListEmpty(s))
{
SListPopFront(s);
}
}
void SListDestroy(SList* s) {//销毁链表
SListClear(s);
free(s->_pHead);
}
void SListPrint(SList* s) {//打印链表
PNode pCur = s->_pHead;
while (pCur->_PNext)
{
pCur = pCur->_PNext;
printf("%d\t",pCur->_data);
}
printf("\n");
}