我一直在想弄清楚如何消除文本文件中的所有“A”节点,“AHHHHHAAAAHHAAHAHHAHAHAAHAAHHA”我已经能够编写删除节点功能了,但它只关注删除头部,但我希望这个功能是能够读取文件并删除所有'A'并打印出所有H'。这是我的删除节点功能
struct Node
{
char data;
Node* pPrev;
Node* pNext;
};
void deleteNode(Node * android)
{
Node * pTemp = android->pNext;
android->data = pTemp->data;
android->pNext = pTemp->pNext;
free(pTemp);
}
这是我在这里找到的另一个删除节点功能,我试图修改,我认为它不起作用。
void deleteNode2(Node * android)
{
Node * pNext;
Node * pHead;
Node * pTail;
Node * pTemp = android->pNext;
if(android->pNext == 'A')
{
pTemp = pNext;
if(pHead = pTail)
{
pHead = pTail = NULL;
}
else
{
pHead = pHead->pNext;
}
}
free(pTemp);
}
int main()中的
while( fscanf(pInFile, "%c", &c) != EOF)
{
appendNode( pTail, c);
// display the list
displayList( pTail->pNext);
};
cout << endl;
cout << "'A' got removed from the List." << endl << endl;
deleteNode2(pTail->pNext);
displayList(pTail->pNext);
答案 0 :(得分:1)
行if(android->pNext == 'A')
会给你一个编译错误:pNext是Node*
,你想要比较数据。将其替换为if (android->pNext.data == 'A')
。
另一个问题是你在if条件表达式中进行赋值,而不是比较:if(pHead = pTail)
不会比较指针,而是将pHead指定为pTail并计算为true(如,输入if语句)如果pTail
不为空。只需使用==
运算符即可解决此问题。
然而,您的代码中存在更多问题。如果只剩下一个元素,deleteNode
将无效。并且程序遍历列表中没有任何内容可以找到您要删除的所有节点。
假设您将此代码段放在主函数中,您应该尝试这样的事情:
Node* deleteNode(Node* android)
{
if (android->next == android) { // only one element
free(android);
return NULL;
} else {
Node * pTemp = android->pNext;
android->data = pTemp->data;
android->pNext = pTemp->pNext;
free(pTemp);
return android;
}
}
size_t listSize(const Node* pNode) {
if (!pNode) return 0;
const Node* pStart = pNode;
size_t n = 0;
do {
pNode = pNode->pNext;
n++;
} while (pNode != pStart);
return n;
}
Node * pTemp = pTail;
size_t len = listSize(pTail);
for (unsigned int i = 0 ; i < len ; i++) {
if (pTemp.data == 'A') {
pTemp = deleteNode(pTemp);
} else {
pTemp = pTemp->next;
}
}
这是一个比看起来更艰难的挑战,因为我们正在处理一个循环列表。这是一个知道何时停止循环的问题。在这种情况下,我只是在程序开始删除它们之前计算了节点数。第一次遍历是安全的,因为它不会修改列表。我已经对此做了重大改动,但如果有人注意到有问题,我会很高兴知道。
只是为了完成答案:循环链接列表可能是一项要求,但如果您只是阻止程序附加“A”字符,则可以使更多更容易。同样,这取决于你的最终目标是什么以及你需要什么。