C语言 你好,我想删除链表中的一个节点,但是我不能,我想了一整天,在我的意见,它可以工作得很好

9ceoxa92  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(79)

在运行过程中会出现段错误,这是我的代码

Pstu DeleteNode(char * name)                                                                       │
{                                                                                                  │
    Pstu Pn = Phead;                                                                               │
    Pstu Pm = Pn;                                                                                  │
    int flag = 1;                                                                                  │
                                                                                                   │
    if(Pn == Pend)                                                                                 │
    {                                                                                              │
                                                                                                   │
        if(Pn == NULL)                                                                             │
        {                                                                                          │
            printf("you need to add some student first!");                                         │
            return NULL;                                                                           │
        }                                                                                          │
        else if(!strcmp(Pn->name,Pn->name))                                                        │
        {                                                                                          │
            printf("only1 and get it!");                                                           │
                                                                                                   │
            return Pn;                                                                             │
        }                                                                                          │
    }                                                                                              │
    else if(Pn->next == Pend)                                                                      │
                    free(Pn);                                                                      │
    else                                                                                           │
    {                                                                                              │
        while(Pn != Pend )                                                                         │
        {                                                                                          │
            if(!strcmp(Pn->name,name))                                                             │
            {                                                                                      │
                    if(flag == 1)                                                                  │
                    {           free(Pn);                                                          │
                        break;                                                                     │
                    }                                                                              │
                    else                                                                           │
                    {                                                                              │
                        free(Pn);                                                                  │
                        Pn = Pn->next;                                                             │
                        Pm->next = Pn;                                                             │
                        printf("infindwhile get it");                                              │
                        return Pm;                                                                 │
                    }                                                                              │
                                                                                                   │
            }                                                                                      │
            else  if(flag == 0)    
{                                                                                      │
                Pm = Pn;                                                                           │
                Pn = Pn->next;                                                                     │
                Pm->next = Pn;                                                                     │
            }                                                                                      │
            else                                                                                   │
            {                                                                                      │
                flag = 0;                                                                          │
                Pn = Pn->next;                                                                     │
                                                                                                   │
                Pm->next = Pn;                                                                     │
            }                                                                                      │
        }                                                                                          │
        if(!strcmp(Pn->name,name))                                                                 │
        {                                                                                          │
                free(Pn);                                                                          │
                printf("finally delete it");                                                       │
                printf("%d\n",Pn->score);                                                          │
                return Pm;                                                                         │
        }                                                                                          │
        else                                                                                       │
            printf("no one\n");                                                                    │
    }
yzuktlbb

yzuktlbb1#

考虑到你的实现对于一个节点删除函数来说似乎太大了(应该需要大约10行),这里有一些你应该关心的建议:

  • 你应该永远不会使用内存后,有免费的d就像你在这里做的
else
{
    free(Pn);
    Pn = Pn->next;
    Pm->next = Pn;
    printf("infindwhile get it");
    return Pm;
}
  • 始终检查返回值的所有代码路径。在某些情况下,函数不返回任何内容。
  • 在命名变量时要更清楚。(在Pm和Pn之间,我真的不知道你的意思,有时候,感觉就像你不知道了)
  • 精确你想要的函数返回值,因为即使是返回值也不清楚,这取决于我们检查函数的哪一部分。

相关问题