我一直在弄清楚如何从文本文件“ AHHHHHAAAAHHAAHAHHAHAHAHAAHAAHHA”中消除所有“ A”节点,但是我已经能够编写删除节点功能,但是它只着眼于去除头部,但是我希望该功能能够读取删除所有“ 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); 最佳答案 if(android->pNext == 'A')行会给您一个编译错误:pNext是一个Node*,并且您想比较数据。将其替换为if (android->pNext.data == 'A')。另一个问题是您要在if条件表达式中进行赋值,而不是进行比较:if(pHead = pTail)不会比较指针,而是将pHead分配给pTail并赋值为true(例如,输入if语句)if 不为null。只需使用pTail运算符即可解决。但是,您的代码中还有更多问题。如果仅剩一个元素,==将不起作用。程序中没有任何遍历列表的操作以查找要删除的所有节点。假设您将此代码段放入了主函数中,则应尝试如下操作: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'字符,则可以使事情变得容易得多。同样,这取决于您的最终目标是什么,以及您的要求是什么。
07-26 04:03