如何释放仅在用C链表单个节点? [英] How to free only a single node in a linked list in C?

查看:128
本文介绍了如何释放仅在用C链表单个节点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我怎么能只释放一个链表一个节点?以下操作,释放整个链表,但我想自由只有一个节点的链表。

  //这里是我的code为删除而(headPtr!= NULL)
{
    TEMP = headPtr;
    headPtr = headPtr->接下来,
    如果(STRCMP(TEMP-GT&; FNAME,stdfname)== 0安培;&安培;
       STRCMP(TEMP-GT&; SNAME,stdsname)== 0)
    {
        免费(TEMP);
    }
}


解决方案

您首先需要知道previous节点。正因为如此,你需要重复,直到你打你要删除的节点。在这个过程中,你需要记住的previous节点。然后,你需要连接previous和明年的节点,因此脱,你要删除的节点。

  currentNode = headNode;
previousNode = NULL;
而(currentNode!= NULL){
    如果(currentNode!= nodeToDelete){
        //不是我们想删除尚未节点,
        //继续到下一个节点。
        previousNode = currentNode;
        currentNode = currentNode->接下来,
        继续;
    }    //现在,我们已经打了节点删除并知道
    // previous节点。修正的结构。
    如果(previousNode){
        previousNode->接下来= nodeToDelete->接下来,
    }其他{
        //没有previous节点意味着它的头节点。
        headNode = nodeToDelete->接下来,
    }    //节点现在从列表脱钩。删除它。
    免费(nodeToDelete);
    //停止循环。
    打破;
}

这是pretty糟糕的表现,明智的,这就是为什么有双链表。在那里,整个操作是这样的:

 如果(nodeToDelete-> previous){
    nodeToDelete-> previous->接下来= nodeToDelete->接下来,
}
如果(nodeToDelete->下面){
    nodeToDelete->下一步 - > previous = nodeToDelete-> previous;
}
如果(nodeToDelete == headNode){
    headNode = nodeToDelete->接下来,
}
免费(nodeToDelete);

正如你所看到的,没有重复在这里也必须在每个节点知道它的previous和下一个节点。

顺便说一句,这些事情成功(他们是pretty基本),它有助于绘制一张纸短链表。抽奖箱,每箱写成员的名字(例如 previous 接下来)从这些与画线部件到相应其他框。后来想想,什么是必要的,以便删除节点来实现。它确实能帮助你理解它是如何工作的。

How can I free only a single node in a linked list? The following frees the whole linked list but I wanted to free only one node in the linked list.

//Here's my code for delete

while(headPtr!=NULL)
{
    temp = headPtr;
    headPtr = headPtr->next;
    if(strcmp(temp->fname, stdfname) ==0 && 
       strcmp(temp->sname, stdsname) ==0  )
    {
        free(temp);
    }
}

解决方案

You first need to know the previous node. Because of that, you need to iterate until you hit the node you want to delete. In that process you need to remember the previous node. Then you need to connection the previous and next nodes, thus "delinking" the node you want to delete.

currentNode = headNode;
previousNode = NULL;
while (currentNode != NULL) {
    if (currentNode != nodeToDelete) {
        // Not the node we want to delete yet,
        // go on to next node.
        previousNode = currentNode;
        currentNode = currentNode->next;
        continue;
    }

    // We've now hit the node to delete and know the
    // previous node. Fix the structure.
    if (previousNode) {
        previousNode->next = nodeToDelete->next;
    } else {
        // No previous node means it's the head node.
        headNode = nodeToDelete->next;
    }

    // The node is now delinked from list. Delete it.
    free(nodeToDelete);
    // Stop the loop.
    break;
}

This is pretty bad performance-wise, which is why there are double-linked lists. There, the whole operations looks like this:

if (nodeToDelete->previous) {
    nodeToDelete->previous->next = nodeToDelete->next;
}
if (nodeToDelete->next) {
    nodeToDelete->next->previous = nodeToDelete->previous;
}
if (nodeToDelete == headNode) {
    headNode = nodeToDelete->next;
}
free(nodeToDelete);

As you can see, no iteration is necessary here as each node knows its previous and next nodes.

BTW, to work these things out (they are pretty basic) it helps to draw a short linked list on a piece of paper. Draw boxes, in each box write the member names (like previous and next) and draw lines from these members to the corresponding other boxes. Then think about what is necessary to do in order to delete the node. It really helps you understand how this works.

这篇关于如何释放仅在用C链表单个节点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆