// 初始化单链表(对于无头结点单链表,该函数没有意义)
void InitList(PSListNode* pHead);
 
// 销毁单链表
void DestroyList(PSListNode* pHead);
 
// 尾插
void PushBack(PSListNode* pHead, DataType data);
 
// 尾出
void PopBack(PSListNode* pHead);
 
// 头插
void PushFront(PSListNode* pHead, DataType data);
 
// 头出
void PopFront(PSListNode* pHead);
 
// 在链表中查找元素data
PSListNode Find(PSListNode pHead, DataType data);
 
// 删除pos位置的结点(注意不能用那种替换形式)
void  Erase(PSListNode* pHead, PSListNode pos);
 
// 在链表的pos位置插入元素data
void  Insert(PSListNode* pHead, PSListNode pos, DataType data);
 
void PrintList(PSListNode pHead);
 
/////////////////////////////////////////////////
 
// 从头至尾打印单链表
void PrintListTailToHead(PSListNode pHead);
 
// 链表的非头结点前插入元素data
void InsertNotHead(PSListNode pos, DataType data);
 
// 删除链表的非尾结点
void DelNotTailNode(PSListNode pos);
 
// 查找链表的中间结点,要求只遍历一次链表
void FindMidNode(PSListNode pHead);


 

 

SList.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;
typedef struct ListNode
{
DataType data;
struct ListNode *pNext;
}SListNode, *PSListNode;
void InitList(PSListNode *pHead)
{
PSListNode pNode = *pHead;
pHead=pNode->data = 0;
pHead=pNode->pNext = NULL;
 
return 0;
}
void DestroyList(PSListNode* pHead)
{
PSListNode pNode=NULL;
PSListNode pPreNode = NULL;
assert(NULL != pHead);
{
pPreNode = pNode;
pNode = pNode->pNext;
free(pPreNode);
}
*pHead = NULL;
}
void PushBack(PSListNode *pHead, DataType data)
{
PSListNode pPrePos = *pHead;
assert(pHead);
if (NULL == *pHead)
{
*pHead = ByeNode(data);
}
else
{
PSListNode pNode = ByeNode(data);
while (pPrePos)
{
if (pPrePos->pNext == NULL)
{
pPrePos->pNext = pNode;
pNode->pNext = NULL;
}
pPrePos = pPrePos->pNext;
}
}
}
void PopBack(PSListNode* pSList)
{
PSListNode pCurNode = *pSList;
PSListNode pPreCurNode = pCurNode;
assert(pSList);
while (pCurNode->pNext)
{
pPreCurNode = pCurNode;
pCurNode->pNext;
}
free(pCurNode);
pPreCurNode->pNext = NULL;
 
}
 
// 头插
void PushFront(PSListNode* pHead, DataType data)
{
assert(pHead);
if (NULL == *pHead)
{
*pHead = ByeNode(data);
}
else
{
PSListNode pNode = ByeNode(data);
 
pNode->pNext = *pHead;
*pHead = pNode;
}
}
 
// 头出
void PopFront(PSListNode* pHead)
{
assert(NULL != pHead);
if (NULL != pHead)
{
return;
}
else
{
PSListNode pNode = *pHead;
*pHead = pNode->pNext;
free(pNode);
}
}
void PrintList(PSListNode pHead)
{
PSListNode pCurNode = pHead;
while (pCurNode)
{
printf("%d->", pCurNode->data);
pCurNode = pCurNode->pNext;
}
printf("NULL\n");
}
 
// 在链表中查找元素data
PSListNode Find(PSListNode pHead, DataType data)
{
PSListNode pNode = pHead;
while (pNode)
{
if (pNode->data == data)
{
return pNode;
}
 
pNode = pNode->pNext;
}
return NULL;
}
 
 
// 删除pos位置的结点(注意不能用那种替换形式)
void  Erase(PSListNode* pHead, PSListNode pos)
{
PSListNode pPrePos = *pHead;
assert(NULL != pHead);
assert(NULL != pos);
//如果是头结点
if (pos == *pHead)
{
*pHead = pos->pNext;
free(pos);
return;
}
while (pPrePos)
{
if (pPrePos->pNext == pos)
{
pPrePos->pNext = pos->pNext;
free(pos);
break;
}
pPrePos = pPrePos->pNext;
}
}
 
// 在链表的pos位置插入元素data
void  Insert(PSListNode* pHead, PSListNode pos, DataType data)
{
PSListNode pNewNode = NULL;//申请空间
assert(NULL != pHead);
assert(NULL != pos);
if (NULL == *pHead)
{
return;
}
pNewNode = ByeNode(data);
if (NULL != pNewNode)
{
pNewNode->pNext = pos->pNext;
pos->pNext = pNewNode;
}
}
 
void PrintList(PSListNode pHead);
 
// 从头至尾打印单链表
void PrintListTailToHead(PSListNode pHead)
{
if (NULL != pHead)
{
PrintListTaiToHaed(pHead->pNext);
printf("%d", pHead->data);
}
}
 
 
// 删除链表的非尾结点
void DelNotTailNode(PSListNode pos)
{
PSListNode pDelNode = NULL;
assert(pos != NULL);
assert(pos->pNext != NULL);
pDelNode = pos->pNext;
pos->data = pDelNode->data;
pos->pNext = pDelNode->pNext;
free(pDelNode);
}
 
// 查找链表的中间结点,要求只遍历一次链表
void FindMidNode(PSListNode pHead)
{
PSListNode pSlow = pHead;
PSListNode pFast = pHead;
 
while (pFast != NULL&&pFast->pNext != NULL)
{
pFast = pFast->pNext->pNext;
pSlow = pSlow->pNext;
}
 
return pSlow;
}
 
 
ListTest.c
#include"SList.h"
#include<stdio.h>
#include<stdlib.h>
 
 
void FunTest1()
{
PSListNode pNode = NULL;
PSListNode pList;
InitList(&pList);
PushFront(&pList, 1);
PushFront(&pList, 2);
PushFront(&pList, 3);
PushFront(&pList, 4);
PrintList(pList);
}
 
int main()
{
FunTest1();
system("pause");
return 0;
}