#ifndef F_Test_2017_11_11_11_JHASKDFJHASF_H_
#define F_Test_2017_11_11_11_JHASKDFJHASF_H_
#include <stdio.h>
/*
单向链表操作
*/
template<class T>
struct FSingletonNode
{
T tValue;
FSingletonNode *pFNodeNext;
};
//清空节点所有数据
template<class T>
void ClearList(FSingletonNode<T> **pHead)
{
FSingletonNode<T> *pCurNode = *pHead;
while(*pHead)
{
pCurNode= (*pHead)->pFNodeNext;
delete *pHead;
*pHead = pCurNode;
}
pHead = NULL;
}
//打印数据
template<class T>
void PrintLite(FSingletonNode<T> *pHead)
{
const char *tType= typeid(T).name();
FSingletonNode<T> *pCurNode = pHead;
while (pCurNode)
{
if (0 == strcmp(tType, "int"))
{
TRACE("%d, ", pCurNode->tValue);
}
else if (0 == strcmp(tType, "float"))
{
TRACE("%f, ", pCurNode->tValue);
}
pCurNode = pCurNode->pFNodeNext;
}
TRACE("\n");
}
//在节点末尾,添加数据
template<class T>
BOOL Pushback(FSingletonNode<T> **pHead, const T tValue)
{
//创建新节点,存数据
FSingletonNode<T> *pCurNode = new FSingletonNode<T>;
pCurNode->tValue = tValue;
pCurNode->pFNodeNext = NULL;
//如果为链表第一个数据,头结点
if (*pHead == NULL)
{
*pHead = pCurNode;
}
else
{
//找到尾节点
FSingletonNode<T> *pEndNode = *pHead;
while(pEndNode->pFNodeNext)
{
pEndNode = pEndNode->pFNodeNext;
}
//将新创建节点设为尾节点
pEndNode->pFNodeNext = pCurNode;
}
return TRUE;
}
//根据数据,删除节点
template<class T>
BOOL RemoveNode(FSingletonNode<T> **pHead, const T tValue)
{
if((*pHead == NULL) || (pHead == NULL))
{
return TRUE;
}
FSingletonNode<T> *pDeleteNode = NULL;
//如果需要删除的是第一个节点
if((*pHead)->tValue == tValue)
{
pDeleteNode = *pHead;
*pHead = (*pHead)->pFNodeNext;
}
else
{
//找到需要删除节点的上一个节点
FSingletonNode<T> *pPreNode = *pHead;
while(pPreNode->pFNodeNext && (pPreNode->pFNodeNext->tValue != tValue))
{
pPreNode = pPreNode->pFNodeNext;
}
//将删除节点的上一个节点的pNext,指向删除节点的下一个节点
if(pPreNode->pFNodeNext && (pPreNode->pFNodeNext->tValue == tValue))
{
pDeleteNode = pPreNode->pFNodeNext;
pPreNode->pFNodeNext = pPreNode->pFNodeNext->pFNodeNext;
}
}
//释放需要删除的节点数据
if (pDeleteNode)
{
delete pDeleteNode;
pDeleteNode = NULL;
}
return TRUE;
}
//测试
void F_Test_List()
{
FSingletonNode<int> *pHead = NULL;
Pushback(&pHead, 10);
Pushback(&pHead, 8);
Pushback(&pHead, 20);
Pushback(&pHead, 5);
Pushback(&pHead, 26);
Pushback(&pHead, 9);
Pushback(&pHead, 4);
Pushback(&pHead, 2);
PrintLite(pHead);
RemoveNode(&pHead, 10);
RemoveNode(&pHead, 26);
RemoveNode(&pHead, 2);
RemoveNode(&pHead, 22);
PrintLite(pHead);
ClearList(&pHead);
FSingletonNode<float> *pHeadF = NULL;
Pushback(&pHeadF, (float)1.5);
Pushback(&pHeadF, (float)8.658);
Pushback(&pHeadF, (float)2.265);
Pushback(&pHeadF, (float)22.456);
PrintLite(pHeadF);
ClearList(&pHeadF);
}
#endif//F_Test_2017_11_11_11_JHASKDFJHASF_H_
C++笔试题(单向链表)
最新推荐文章于 2022-04-03 23:04:11 发布