鱼C论坛

 找回密码
 立即注册
查看: 2118|回复: 9

关于链表的删除有点问题想请教

[复制链接]
发表于 2018-9-20 17:47:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<stdlib.h>
#define LN sizeof(struct student)

struct student
{
    int num;
    int score;
    struct student *next;
};

struct student *add();                                       //增加链表+填充内容
struct student *del(struct student *,int m);         //删除节点
void print(struct student *head);                       //打印链表

int n;

int main()
{
    struct student *stu;
    int m;
    stu = add();
    print(stu);


    printf("\nplease input the delete num:");             //没有读到这里,似乎出现了问题
    scanf("%d",&m);
    print(del(stu,m));


    system("pause");
    return 0;
}

struct student *add()
{
    struct student *head;
    struct student *p1,*p2;
    p1 = p2 = (struct student *)malloc(LN);
   
    printf("please input the num:");
    scanf("%d",&p1->num);
    printf("please input the score:");
    scanf("%d",&p1->score);
   
    head = NULL;
    n = 0;
   
    while(p1->num != 0)
    {
        n++;
       if(n == 1)
       {
            head = p1;
       }else
       {
            p2->next = p1;
       }
        p2 = p1;
        p1 = (struct student *)malloc(LN);
        printf("please input the num:");
        scanf("%d",&p1->num);
        printf("please input the score:");
        scanf("%d",&p1->score);
    }
    return head;
}



struct student *del(struct student *head,int m)
{
    struct student *p1,*p2;
    p1 = head;
    if(p1 == NULL)
    {
    printf("This is a NULL!!\n");
    goto END;
    }

    while(p1->num != m && p1->next != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }
    if(m == head->num)
    {
        head = p1->next;
    }else
    {
        p2->next = p1->next;
    }
    printf("\nDelete %d number is succeful!",m);
    n = n-1;
END:
    return head;
}



void print(struct student *head)
{
    struct student *p;
    p = head;
    printf("\n\n");
    printf("There is %d records!",n);
    printf("\n\n");
    while(p->next != NULL)
    {
        printf("学号为:%d,分数是:%d\n",p->num,p->score);
        p = p->next;
    }
}

不知道为什么没有读到删除的那个部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-20 18:23:47 From FishC Mobile | 显示全部楼层
结构错了
*add() 不需要 *head
if()
    p1->next = NULL;
else
    p2->next = p2;
....
return p2;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-20 18:45:38 | 显示全部楼层
claws0n 发表于 2018-9-20 18:23
结构错了
*add() 不需要 *head
if()

这个是在*add里面的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 18:54:54 From FishC Mobile | 显示全部楼层
czj1016130386 发表于 2018-9-20 18:45
这个是在*add里面的吗

对 里面修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-20 21:45:22 | 显示全部楼层

你好,我刚刚试了很多次单步调试,都是在print函数里面的循环跳不出来,出现c0000005错误,应该不是结构上的问题吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 23:07:00 From FishC Mobile | 显示全部楼层
czj1016130386 发表于 2018-9-20 21:45
你好,我刚刚试了很多次单步调试,都是在print函数里面的循环跳不出来,出现c0000005错误,应该不是结构 ...

你的结构没有尾指针,所以死循环了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 10:19:14 | 显示全部楼层
claws0n 发表于 2018-9-20 23:07
你的结构没有尾指针,所以死循环了

那不知道怎么改,我改了很多方法还是死循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 11:54:01 | 显示全部楼层
claws0n 发表于 2018-9-20 23:07
你的结构没有尾指针,所以死循环了

我懂了  谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 22:31:01 | 显示全部楼层

嗯,懂就好,按照 2 楼的提示修改。不好意思,电脑出了一些问题,那时不能发代码~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 22:48:06 | 显示全部楼层
你的代码的问题
p1 = (struct student *)malloc(LN);
head = NULL;
    n = 0;
   
    while(p1->num != 0)
    {
        n++;
       if(n == 1)
       {
            head = p1;    //原本是空指针的 head  突然变成 p1, 之后就没有再也没有看到 NULL 了。之后的遍历就一直找不到 NULL,无法停止
       }else
       {
            p2->next = p1;
       }
        p2 = p1;
        p1 = (struct student *)malloc(LN);
    }
    return head;    // head 是你第一个节点而已,思考以下~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 10:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表