qq_35541626 2020-10-13 17:40 采纳率: 0%
浏览 63

关于c语言链表的指针问题

这个是我尝试用c语言写的链表,现在写到了删除链表中的一个节点的步骤。然后我在这步出现了一个很费解的问题。在void free-node这个方法中,我希望用辅助指针p-freeAid 来辅助我删掉链表中的节点。

下面是我遇到的问题:
① 我已经用P-freeAid指向了 p-free的下一个节点。我在debug里也看到,p-free的下一个节点的地址==p-freeaid的值。
但是我尝试用 p—freeaid去调p—free的下一个节点的num的值却显示系统错误,相当费解。
②当我用free释放了p—free所指的内存空间后,我用p-free 读里面的值仍是有结果的,但是 debug里面显示的 p free的值是“-179469979(类似与这样的数)”我感觉这个就证明空间已经释放了,但是还是能读到值,这点也超级费解。

代码贴到下面了,请大神解答一下,感激不禁~

typedef struct student_link
{
    char name[20];
    int num;
    int score;
    struct student_link *next;
}STU;

void creat_head(STU **p_head,STU *p_new){
    STU *p_mov;
    p_mov=*p_head;
    if(*p_head==NULL){
    *p_head=p_new;
     p_new->next=NULL;
    }
    else {
        while ((p_mov->next)!=NULL) {
            p_mov=p_mov->next;
        }
        p_mov->next=p_new;
        p_new->next=NULL;
    }
}
void showThe_link(STU*p_head){
    STU *p_mov;
    p_mov=p_head;
    if(p_head==NULL){
        printf("当前链表为空\n");
        return;
    }else{
        while (p_mov!=NULL) {
            printf("%d %d %s\n",p_mov->num,p_mov->score,p_mov->name);
            p_mov=p_mov->next;
        }
    }

}

STU* creat_node(int num,int score,char stu_name[]){
    STU*p_new;
    p_new=(STU*)malloc(sizeof(STU));
    strcpy(p_new->name,stu_name);
    p_new->num=num;
    p_new->score=score;
    return p_new;
}
void add_node(STU **p_head,int num,int score,char stu_name[]){
    creat_head(p_head,creat_node(num,score,stu_name));
}
void free_node(STU **p_head){
    STU*p_free;
    STU*p_freeAid;
    printf("p_freeAid的值是:0X%x\n",p_freeAid->num);
    p_free=*p_head;
    if(*p_head==NULL){
        printf("这个链表为空,无需释放\n");
    }
    else{
        while (p_free!=NULL) {
            p_freeAid=p_free->next;
            printf("p_freeAid的值是:0X%x\n",p_free->next->num);
            printf("p_freeAid的值是:0X%x\n",p_freeAid);
            printf("p_free的值是:0X%x\n",p_free->next);
            int num=p_free->num;
            printf("%d\n",num);
            free(p_free);
            printf("%d\n",p_free->num);
            p_free=p_freeAid;
        }
    }
    //*p_head=NULL;
}
int main()
{
    STU* link_head=NULL;
   /* int num,i;
    printf("请输入链表初始的个数:\n");
    scanf("%d",&num);
    for(i=0;i<num;i++){
        p_new=(STU*)malloc(sizeof(STU));
        printf("请输入学号、分数、名字:\n");
        scanf("%d %d %s",&p_new->num,&p_new->score,&p_new->name);
        } */
    char str[12]="cherry";
    add_node(&link_head,6,7,str);
    add_node(&link_head,9,7,str);
    showThe_link(link_head);
    //free_node(&link_head);
    showThe_link(link_head);
    return 0;
}
  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2020-10-13 19:38
    关注
    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境