如何在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 

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

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

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

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

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

然后在DeleteNode中,您必须将内存返回到堆中,因为您不再需要它:

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.
}

注意!您为创建节点而编写的函数无法按原样工作:该节点是在函数的上下文中在堆栈上分配的,在函数退出后无效。

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

[作为答案发布以获得正确的格式设置]注意: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== %sn",title);
    while(list){
        printf("t%dn",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);
}

相关内容

  • 没有找到相关文章

最新更新