【问题标题】:Inserting Node into first place C programming将 Node 插入首位 C 编程
【发布时间】:2014-04-08 09:28:46
【问题描述】:

这是我正在编写的一个程序的函数,用于更熟悉节点。我不确定它是否正确,但本质上它会检查节点是否为 Null,如果是,那么它将信息添加到代码字段并将指针设置为 NULL。

否则它会创建一个新节点并将信息插入到代码字段中,然后指向现有的第一个节点。我不确定如何将指向原始第一个节点的标头更改为指向新节点。代码是

typedef struct node {
    LibraryCode location;
    struct node *next;
} Node;

void insertFirstNode(LibraryCode code, Node **listPtr) {

    Node *n=*listPtr;
    Node *first;
    if(n==NULL){
        n=malloc(sizeof(Node));
        n->location=code;
        n->next=NULL;
    } else
    {
        Node *first;
        first->location=code;
        first->next=n;
    }
}

【问题讨论】:

    标签: c struct linked-list


    【解决方案1】:

    您需要无条件地创建新节点(并将位置设置为新值)。

    如果已经有一个列表,你可能想在列表的最前面插入这个节点,如果没有列表,那么这成为第一个节点?注意重命名的函数;它反映了一个节点总是会被插入的事实。

    在前面插入

    void insertNode(LibraryCode code, Node **listPtr)
    {
        Node *new_node = malloc(sizeof(*new_node));
        if (new_node == 0)
            err_exit("Out of memory");
        new_node->location = code;
        new_node->next = *listPtr;
        *listPtr = new_node;
    }
    

    在末尾插入

    如果你想在已经有列表的情况下插入到列表的末尾,那么:

    void insertNode(LibraryCode code, Node **listPtr)
    {
        Node *new_node = malloc(sizeof(*new_node));
        if (new_node == 0)
            err_exit("Out of memory");
        new_node->location = code;
        new_node->next = NULL;
        if (*listPtr == NULL)
            *listPtr = new_node;
        else
        {
            Node *node = *listPtr;
            while (node->next != NULL)
                node = node->next;
            node->next = new_node;
        }
    }
    

    如果您想在列表已分配的情况下出现错误,那么您需要重新考虑您的 API 设计。

    【讨论】:

      【解决方案2】:

      **listPtr 是存放或存放列表头节点的地址。如果 *listPtr == null 那么列表是空的,我认为从所提供的内容来看是惯例。在任何情况下,我们都需要为提供的 LibraryCode 构建一个新节点。所以有点缩短(一些错误处理没有说明)..

      void insertFirstNode(LibraryCode code, Node **listPtr){
        node = malloc( sizeof(Node) );
        node->location = code;
        node->next = *listPtr;
        *listPtr = node;
      }
      

      【讨论】:

        【解决方案3】:

        基本上,您有两种选择。如果现有的listPtr 为空,那么您有一个空列表,只需要创建它的第一个条目。如果 listPtr 不为空,则列表已经存在,您只需将新节点填充到列表的开头即可。

        所以在伪代码中:

        if (listptr == null) {
           ... empty chain, create one
           n = malloc(...);
           n->location = code;
           n->next = null;
        } else {
           ... got an existing chain
           n = malloc(...);
           n->location = code;
           n->next = listptr; // make previous top of chain be a child of new node}
        }
        return n;
        

        【讨论】:

        • 把指向链表头的指针指向新节点的头呢? n->next 不只是将第一个节点指向第二个节点。
        • 这就是单链表的问题。这是 NO 方法让您的函数知道它是在处理列表中的第一个 TRUE 节点,还是仅处理列表中的 A 节点。没有“上一个”链接,因此无法备份该列表。将新节点作为新的列表头处理不取决于此函数 - 取决于调用代码。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-30
        • 2013-01-26
        • 1970-01-01
        相关资源
        最近更新 更多