#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
/* 定义一个数字节点 */
typedef struct tagStNode
{
int iData;
struct tagStNode *pNext;
}StNode;
/* 创建iNum个节点,返回指向第一个节点的指针 */
StNode* Create(int iNum);
/* 打印 */
void Print(StNode *pstHead);
/* 将链表反转 */
StNode* Reverse(StNode *pstHead);
//void Delete(StNode *pstHead);
/* 删除链表中的第iNum个节点 */
void Delete(StNode *pstHead, int iNum);
/* 只遍历一次,求中间节点 *
*/
void SearchMid(StNode *pstHead, StNode **pstMid);
StNode* Create(int iNum)
{
StNode *pstHead = NULL;
StNode *pstPtr = NULL;
StNode *pstTmpPtr = NULL;
int iCount = 0;
assert(iNum >= 0);
pstHead = (StNode *)malloc(sizeof(StNode));
assert(NULL != pstHead);
pstHead->iData = iCount;
pstHead->pNext = NULL;
pstPtr = pstHead;
for (iCount = 1; iCount < iNum; iCount++)
{
pstTmpPtr = (StNode *)malloc(sizeof(StNode));
assert(NULL != pstTmpPtr);
pstTmpPtr->iData = iCount;
pstTmpPtr->pNext = NULL;
pstPtr->pNext = pstTmpPtr; /* 将新建的节点挂载到前面节点后面 */
pstPtr = pstPtr->pNext; /* 指向下一个节点 */
}
return pstHead;
}
void Print(StNode *pstNode)
{
StNode *pstPtr = NULL;
assert(NULL != pstNode);
pstPtr = pstNode;
while(NULL != pstPtr)
{
printf("%d\n", pstPtr->iData);
pstPtr = pstPtr->pNext;
}
return;
}
/*
void Delete(StNode *pstHead)
{
StNode *pstPtr = NULL;
assert(NULL != pstHead);
pstPtr = pstHead;
while (NULL != pstPtr)
{
free(pstPtr);
}
}
*/
StNode* Reverse(StNode *pstHead)
{
StNode *pstPtr1 = NULL;
StNode *pstPtr2 = NULL;
StNode *pstPtrTmp = NULL;
assert(NULL != pstHead);
pstPtr1 = pstHead;
pstPtr2 = pstPtr1->pNext;
while (NULL != pstPtr2)
{
pstPtrTmp = pstPtr2->pNext;
pstPtr2->pNext = pstPtr1;
pstPtr1 = pstPtr2;
pstPtr2 = pstPtrTmp;
}
pstHead->pNext = NULL;
// pstHead = pstPtr1;
return pstPtr1;
}
void Delete(StNode *pstHead, int iNum)
{
StNode *pstPtr1 = NULL;
StNode *pstPtr2 = NULL;
int iCount = 1;
assert(NULL != pstHead);
assert(iNum >= 0);
pstPtr1 = pstHead;
/* 显示ptr1指向待删除节点的前一个节点,ptr2指向待删除节点 */
for (; iCount < iNum; iCount++)
{
pstPtr1 = pstPtr1->pNext;
}
pstPtr2 = pstPtr1->pNext;
printf("%d %d\n", pstPtr1->iData, pstPtr2->iData);
pstPtr1->pNext = pstPtr2->pNext;
pstPtr2->pNext = NULL;
assert(NULL != pstPtr2);
free(pstPtr2);
return ;
}
void SearchMid(StNode *pstHead, StNode **pstMid)
{
StNode *pstPtr1 = NULL;
StNode *pstPtr2 = NULL;
assert(NULL != pstHead);
pstPtr1 = pstHead;
pstPtr2 = pstHead;
while (NULL != pstPtr1->pNext->pNext)
{
pstPtr2 = pstPtr2->pNext;
pstPtr1 = pstPtr1->pNext->pNext;
}
*pstMid = pstPtr2;
return ;
}
int main(void)
{
StNode *pstNode = Create(10);
// StNode *pstPtr = NULL;
StNode *pstMid = NULL;
Print(pstNode);
// pstPtr = Reverse(pstNode);
// Print(pstPtr);
// Delete(pstNode, 3);
// Print(pstNode);
SearchMid(pstNode, &pstMid);
printf("MID %d\n", pstMid->iData);
return 0;
}