如何在C中获取指向指针的指针?

How to obtain a pointer to pointer in C?

我应该编写一个函数来删除链表中的第一个节点。 列表定义如下:

struct ListNode{
    int nInfo;
    struct ListNode *next;
};

struct ListNode *createNode(int nInfo) {
    ListNode *node;
    node->nInfo = nInfo;
    node->next = NULL;
    return node;
}

void insertNode(struct ListNode **list, struct ListNode *node) {
    //Sorting list after nInfo
    struct ListNode *temp;
    struct ListNode *tmpList = *list;
    if(*list != NULL) { //List exists
        while((tmpList->next != NULL)) {
            if((tmpList->nInfo >= node->nInfo) && (tmpList->next->nInfo < node->nInfo)) {
                break;
            }
            tmpList = tmpList->next;
        }
        //Found where to insert the node
        temp = tmpList->next;   //Saving old nextnode
        tmpList->next = node;   //Assigning new nextnode
        node->next = temp;  //Re-inserting old node
    }
    else{
        *list = node;
    }
}

删除第一个节点的函数如下所示:

void deleteFirst(struct ListNode **list) {
    //Delete first node
    struct ListNode *temppointer = *list;
    if(temppointer == NULL)
        return; //List is NULL
    *list = temppointer->next;
}

我是这样使用函数的:

struct ListNode *list = createNode(100);
struct ListNode *node1 = createNode(50);
insertNode(list, node1); //Gives error, cannot convert ListNode* to ListNode**
deleteFirst(list); //Same error 

我不知道如何获取指向列表指针的指针。

注意!你写的创建节点的函数不能按原样运行:节点分配在栈上,在函数的上下文中,函数退出后无效。

您必须使用(p.e.) malloc 为堆上的节点分配内存。从列表中删除节点的函数负责其释放,通常使用 free.

正如我们所怀疑的,您忘记为您的节点分配内存:

struct ListNode *createNode(int nInfo) {
    ListNode *node;
    node->nInfo = nInfo;
    node->next = NULL;
    return node;
}

您的 *node 是一个指针,但它仍然指向任何内容。您必须向堆请求您的节点的内存:

    ListNode *node = malloc(sizeof(ListNode));

然后在DeleteNode中,你必须return把内存放到堆上,因为你不再需要它了:

void deleteFirst(struct ListNode **list) {
    //Delete first node
    struct ListNode *temppointer = *list;
    if(temppointer == NULL)
        return; //List is NULL
    *list = temppointer->next;
    free(temppointer);    // release the memory.
}

[作为答案发布以获得正确的格式] 注意:您的 insert() 函数过于复杂。可以减少到

void insertNode(struct ListNode **list, struct ListNode *node) {
    for( ; *list ; list = &(*list)->next ) { //List exists
        if(*(list)->nInfo >= node->nInfo) break;
        }
    //Found where to insert the node
    node->next = *list;
    *list = node;
}
#include <stdlib.h>

struct ListNode{
    int nInfo;
    struct ListNode *next;
};

struct ListNode *createNode(int nInfo) {
    struct ListNode *node=malloc(sizeof(*node));
    if(node){
        node->nInfo = nInfo;
        node->next = NULL;
    }
    return node;
}

void insertNode(struct ListNode **list, struct ListNode *node) {

    // for safety
    if(!list) return;
    if(!node) return;


    //Sorting list after nInfo

    struct ListNode *temp;
    struct ListNode *tmpList = *list;

    if(tmpList!= NULL) { //List exists
        while(tmpList->next) {

            if( 
                ((tmpList->nInfo)>= (node->nInfo))  
                && 
                ((tmpList->next->nInfo) < (node->nInfo))
              ) {
                break;
            }
            tmpList = tmpList->next;
        }
        //Found where to insert the node
        temp = tmpList->next;   //Saving old nextnode
        tmpList->next = node;   //Assigning new nextnode
        node->next = temp;  //Re-inserting old node
    }
    else{
        *list = node;
    }
}


void deleteFirst(struct ListNode **plist) {
    if(!plist) return;

    struct ListNode *list=*plist;
    if(!list) return;

    *plist=list->next;
    free(list);
    return ;

}


void printNodes(char *title,struct  ListNode *list){
    printf("\n== %s\n",title);
    while(list){
        printf("\t%d\n",list->nInfo);
        list=list->next;
    }
    printf("\n");
}
int main(){
    struct ListNode *list = createNode(100);
    struct ListNode *node1 = createNode(50);
    insertNode(&list, node1); 
    printNodes("on start",list);

    insertNode(&list, createNode(70));
    printNodes("after add 70",list);

    deleteFirst(&list); 
    printNodes("after del first",list);

}