思维导图

SList.h
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int DataType;
typedef struct SNode
{
DataType data;
struct SNode *_pNext;
}SNode, *PNode;
void SListInit(PNode* pHead);
void SListPushBack(PNode* pHead, DataType data);
void SListPopBack(PNode* pHead);
void SListPushFront(PNode* pHead, DataType data);
void SListPopFront(PNode* pHead);
PNode SListFind(PNode pHead, DataType data);
void SListInsert(PNode* pHead, PNode pos, DataType data);
void SListErase(PNode* pHead, PNode pos);
int SListSize(PNode pHead);
int SListEmpty(PNode pHead);
void SListDestroy(PNode* pHead);
void PrintfList(PNode pHead);
SList.c
#include "SList.h"
void SListInit(PNode* pHead)
{
assert(pHead);
*pHead = NULL;
}
PNode BuyNewNode(DataType data)
{
PNode ptr = NULL;
ptr = (PNode)malloc(sizeof(DataType)+sizeof(PNode));
if (NULL == ptr)
{
printf("BuyNewNode failed!!!\n");
return NULL;
}
ptr->data = data;
ptr->_pNext = NULL;
return ptr;
}
void PrintfList(PNode pHead)
{
PNode ptr = pHead;
if (pHead == NULL)
return;
while (ptr)
{
printf("%d-->", ptr->data);
ptr = ptr->_pNext;
}
printf("NULL\n");
}
void SListPushBack(PNode* pHead, DataType data)
{
PNode pCur = NULL;
assert(pHead);
if (*pHead == NULL)
{
*pHead = BuyNewNode(data);
return;
}
pCur = *pHead;
while (pCur->_pNext)
{
pCur = pCur->_pNext;
}
pCur->_pNext = BuyNewNode(data);
}
void SListPopBack(PNode* pHead)
{
assert(pHead);
PNode pPre = *pHead;
PNode pCur = *pHead;
if (*pHead == NULL)
{
printf("链表已空,删除失败!!!\n");
return;
}
if (pCur->_pNext == NULL)
{
free(*pHead);
*pHead = NULL;
return;
}
while (pCur->_pNext)
{
pPre = pCur;
pCur = pCur->_pNext;
}
free(pPre->_pNext);
pPre->_pNext = NULL;
}
void SListPushFront(PNode* pHead, DataType data)
{
PNode ptr = NULL;
assert(pHead);
if (NULL == *pHead)
{
*pHead = BuyNewNode(data);
return;
}
ptr = *pHead;
*pHead = BuyNewNode(data);
(*pHead)->_pNext = ptr;
}
void SListPopFront(PNode* pHead)
{
assert(pHead);
PNode ptr = NULL;
if (NULL == pHead)
{
printf("链表已空,删除失败!!!\n");
return;
}
if ((*pHead)->_pNext == NULL)
{
free(*pHead);
*pHead = NULL;
return;
}
ptr = *pHead;
*pHead = (*pHead)->_pNext;
free(ptr);
}
PNode SListFind(PNode pHead, DataType data)
{
PNode ptr = pHead;
if (NULL == pHead)
{
printf("对不起,为空链表!!!\n");
return NULL;
}
while ((ptr) && (ptr->data != data))
{
ptr = ptr->_pNext;
}
if (NULL == ptr)
{
printf("对不起,找不到!!!\n");
return NULL;
}
else
return ptr;
}
int SListSize(PNode pHead)
{
int count = 0;
while (pHead)
{
pHead = pHead->_pNext;
count++;
}
return count;
}
void SListInsert(PNode* pHead, PNode pos, DataType data)
{
assert(pHead);
if (NULL == *pHead)
{
if (pos == *pHead)
{
*pHead = BuyNewNode(data);
return;
}
else
{
printf("位置不合法,插入失败!!!\n");
return;
}
}
if (pos == *pHead)
SListPushFront(pHead, data);
else
{
PNode pPre = *pHead;
PNode pCur = *pHead;
while ((pCur) && (pCur->_pNext != pos))
{
pCur = pCur->_pNext;
}
if (pCur == NULL)
{
printf("对不起,找不到该节点!!!\n");
return;
}
else
{
pCur->_pNext = BuyNewNode(data);
pCur->_pNext->_pNext = pos;
pos = pCur->_pNext;
}
}
}
void SListErase(PNode* pHead, PNode pos)
{
assert(pHead);
PNode ptr = *pHead;
if (NULL == *pHead)
{
printf("链表已空,删除失败!!!\n");
return;
}
if ((*pHead)->_pNext == NULL)
{
if (*pHead == pos)
{
free(pos);
*pHead = NULL;
return;
}
else
{
printf("位置不合法,删除失败!!!\n");
return;
}
}
if (pos == *pHead)
{
*pHead = (*pHead)->_pNext;
free(pos);
return;
}
while ((ptr) && (ptr->_pNext != pos) && (pos))
{
ptr = ptr->_pNext;
}
if ((ptr == NULL) || (pos == NULL))
{
printf("节点不存在,删除失败!!!\n");
return;
}
else
{
ptr->_pNext = pos->_pNext;
free(pos);
}
}
int SListEmpty(PNode pHead)
{
if (pHead)
return 1;
return 0;
}
void SListDestroy(PNode* pHead)
{
assert(pHead);
PNode ptr = *pHead;
PNode pMsg = *pHead;
while (ptr)
{
ptr = ptr->_pNext;
free(pMsg);
if (ptr)
pMsg = ptr;
}
*pHead = NULL;
}
test.c
#include "SList.h"
#include <windows.h>
int main()
{
SNode SList;
PNode pHead = &SList;
SListInit(&pHead);
SListEmpty(pHead);
SListInsert(&pHead, pHead, 40);
PrintfList(pHead);
SListPushBack(&pHead, 5);
SListPushBack(&pHead, 10);
SListPushBack(&pHead, 3);
SListPushFront(&pHead, 0);
PrintfList(pHead);
SListFind(pHead, 3);
SListSize(pHead);
SListInsert(&pHead, pHead->_pNext->_pNext , 20);
PrintfList(pHead);
SListErase(&pHead, pHead->_pNext->_pNext);
PrintfList(pHead);
system("pause");
return 0;
}