求大神解答,为什么链表的节点free不了,不加倒没事,一加就报。

暴打章鱼哥 2018-11-13 05:37:29
代码如下,大神就解答

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct info{

int num;
char name[100];

struct info * pnext;

};


void add(struct info **phead,int num,char name[100]){//增加节点

if ((*phead)==NULL){


(*phead) = (struct info * )malloc(sizeof(struct info));

(*phead)->num = num;

strcpy((*phead)->name, name);

(*phead)->pnext = NULL;





} else{

struct info *p = *phead;

while (p->pnext != NULL){

p=p->pnext;
}

struct info *pp = (struct info *)malloc(sizeof(struct info));

pp->num = num;

strcpy(pp->name, name);

pp->pnext = NULL;

p->pnext = pp;

}

}

void Modify(struct info **phead,int num,char oldname[100]){//修改节点


struct info * p = (*phead);

while( p->pnext != NULL){

if (p->num == num){
strcpy(p->name, oldname);
break;
}
p = p->pnext;
}

}

void delet(struct info **phead, int num){//删除节点

struct info *p = (*phead);

struct info * qq=NULL;//记录前一个节点的地址

while (p->pnext != NULL){

if (p->num == num){

qq->pnext = p->pnext;

free(p);


}

qq = p;
p = p->pnext;



}



}


int main(void){

struct info * phead=NULL;

add(&phead,1,"jjjjj");

add(&phead, 2, "jjkkj");

add(&phead, 3, "jjhmj");

Modify(&phead,2,"hahahahhahaha");

delet(&phead, 2);

printf("\n %d %s", phead->num, phead->name);
printf("\n %d %s", phead->pnext->num, phead->pnext->name);
//printf("\n %d %s", phead->pnext->pnext->num, phead->pnext->pnext->name);


system("pause");



}
...全文
153 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-11-14
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
轻箬笠 2018-11-14
  • 打赏
  • 举报
回复
存在两个问题,代码如下
void delet(struct info **phead, int num) 
{//删除节点
    struct info *p = (*phead);
    struct info * qq = NULL;//记录前一个节点的地址  

    while (p->pnext != NULL) {
        if (p->num == num) {
            if (qq)//这里需要判断当前节点是否有前一个节点
                qq->pnext = p->pnext;
            else
                *phead = p->pnext;

            free(p);
            break;//这里需要退出循环
        }

        qq = p;
        p = p->pnext;
    }
}
冷风1023 2018-11-14
  • 打赏
  • 举报
回复
感觉删除的逻辑有问题,测试下吧。
xueyu人生 2018-11-14
  • 打赏
  • 举报
回复
1.modify最后一个数据查询不到,修改如下: while( p != NULL){ if (p->num == num){ strcpy(p->name, oldname); break; } p = p->pnext; } 2.删除时,上面查找到后free(p),p都释放了,下面p = p->pnext;当然会出问题,还有些逻辑错误,你自己理理,我有别的事要看看。
zhouqunhai 2018-11-14
  • 打赏
  • 举报
回复
明显逻辑有问题

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧