繁体   English   中英

从单链通函列表中删除特定节点

[英]Deleting specific node(s) from Singly Linked Circular List

我一直在研究如何从文本文件“ 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语句)(如果pTail不为null)。 只需使用==运算符即可解决。

但是,您的代码中还有更多问题。 如果仅剩一个元素,则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'字符,则可以使事情变得容易得多 同样,这取决于您的最终目标是什么,以及您的要求是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM