正在从Singly Linked Circular List中删除特定节点



我一直在想如何从文本文件中删除所有的"A"节点,"AHHHHHAAAAHHAAHHAHAHAAAHAHAHAHAAHAAHHA"我已经能够编写删除节点函数,但它只专注于删除头,但我希望这个函数能够读取文件并删除所有的‘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,并在pTail不为null的情况下计算为true(如中所示,输入if语句)。只需使用==运算符即可解决此问题。

然而,您的代码中还有更多的问题。如果只剩下一个元素,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"字符,你可以让变得更容易。同样,这取决于你的最终目标是什么以及你被要求什么。

相关内容

  • 没有找到相关文章