望处雨收云断秋 2023-12-22 16:13 采纳率: 77.8%
浏览 7
已结题

pta上链表问题,还是链表问题

img

img


#include<stdio.h>
#include<stdlib.h>
typedef struct stu
{
    int id;
    char name[10];
    int score;
    struct stu* next;
}STU;
STU *creat();
STU *delete(STU* head,int minscore);
void print(STU* head);
int main()
{
    int minscore;
    STU* head=NULL;
    head=creat();
    scanf("%d",&minscore);
    head=delete(head,minscore);
    print(head);
}
STU* creat()
{
    STU* head=NULL;
    STU* pnew,*tail=NULL;
    pnew=(STU*)malloc(sizeof(STU));
    scanf("%d %s %d",&pnew->id,pnew->name,&pnew->score);
    while(pnew->id!=0)
    {
        if(head==NULL)
        {
            head=pnew;
            tail=pnew;
        }
        else
        {
            tail->next=pnew;
            tail=pnew;
        }
        pnew=(STU*)malloc(sizeof(STU));
        scanf("%d %s %d",&pnew->id,pnew->name,&pnew->score);
    }
    return head;//尾插法建立链表
}
STU* delete(STU* head,int minscore)
{
    STU* p,*q;
    int flag,count=0;//此时是大于指定成绩的头结点,不判断
    while(head->score>minscore)
    {
        head=head->next;//找到大于指定成绩的结点,将它作为头节点
    }
    p=head;
    q=head;
    while(p!=NULL)
    {
        flag=1;//每轮都默认链表中的结点成绩大于指定成绩
       if(p->score<minscore||count==0)
       {
           flag=0;
       }
        if(flag==1)//该节点的成绩大于指定成绩
        {
            q->next=p;
            q=p;//连接链表
        }
        p=p->next;
    }
    return head;
}
void print(STU* head)
{
    STU* p=head;
    while(p!=NULL)
    {
        printf("%d %s %d",p->id,p->name,p->score);
        p=p->next;
    }
}

系统报的是段错误,可能是删除结点错误了?可以给出解答方案,谢谢。

img

  • 写回答

4条回答 默认 最新

  • 关注

    你的代码错误太多了,有几个重要的错误特别说明一下:
    (1)create函数中,节点的pnew->next没有设置为NULL,导致链表尾节点的next是一个未初始化的指针,也就是链表不会正常结束,导致崩溃。
    (2)delete是C语言的关键字,不能用作函数名、变量名。
    (3)删除函数的逻辑是错误的。
    (4)create函数中,因为最后一行0的时候,只有1个int,后面的名字和成绩没用,所用不能一次直接读取3个元素,要先读取学号,如果学号不为0,再读取名字和成绩。
    代码修改如下:

    
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct stu
    {
        int id;
        char name[10];
        int score;
        struct stu* next;
    }STU;
    STU* Create_Stu_Doc();
    STU* DeleteDoc(STU* head, int minscore);
    void Print_Stu_Doc(STU* head);
    int main()
    {
        int minscore;
        STU* head = NULL;
        head = Create_Stu_Doc();
        scanf("%d", &minscore);
        head = DeleteDoc(head, minscore);
        Print_Stu_Doc(head);
    }
    STU* Create_Stu_Doc()
    {
        STU* head = NULL;
        STU* pnew, * tail = NULL;
        pnew = (STU*)malloc(sizeof(STU));
        pnew->next = NULL;  //修改,这里增加一行,将pnew->next置为NULL,保证链表正确结束
        scanf("%d", &pnew->id); //修改,先读取学号,学号为0就不读后面的名字和成绩了
        while (pnew->id != 0)
        {
            scanf("%s %d",pnew->name, &pnew->score);
            if (head == NULL)
            {
                head = pnew;
                tail = pnew;
            }
            else
            {
                tail->next = pnew;
                tail = pnew;
            }
            pnew = (STU*)malloc(sizeof(STU));
            pnew->next = NULL; //修改,这里增加一行,将pnew->next置为NULL,保证链表正确结束
            scanf("%d", &pnew->id); //修改,修改,先读取学号,学号为0就不读后面的名字和成绩了
        }
    
        return head;//尾插法建立链表
    }
    STU* DeleteDoc(STU* head, int minscore)
    {
        STU* p, * q;
        int flag, count = 0;//此时是大于指定成绩的头结点,不判断
        while (head->score < minscore) //如果head节点成绩一直小于minscore,就删除  //修改,这里改成<,因为删掉的是小于minscore的节点
        {
            p = head->next;
            free(head);
            head = p;
            //head = head->next;//找到大于指定成绩的结点,将它作为头节点
        }
        p = head;
        if (head == NULL)
            return NULL; //如果所有数据都小于minscore,就是空表
        q = head->next; // 修改,这里q指向head的下一个节点,因为经过上面的while,head->score肯定是>=minscore的,从head.next开始判断就可以了
        while (q != NULL )//修改,这里用q
        {
            if (q->score < minscore)
            {
                p->next = q->next;
                free(q);
                q = p->next;
            }
            else
            {
                p = q;
                q = q->next;
            }
        }
        return head;
    }
    void Print_Stu_Doc(STU* head)
    {
        STU* p = head;
        while (p != NULL)
        {
            printf("%d %s %d\n", p->id, p->name, p->score); //修改,这里增加一个\n
            p = p->next;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 12月30日
  • 已采纳回答 12月22日
  • 修改了问题 12月22日
  • 修改了问题 12月22日
  • 展开全部

悬赏问题

  • ¥15 centos7系统下abinit安装时make出错
  • ¥15 帮看看这个为何无法运行
  • ¥15 hbuildex运行微信小程序报错
  • ¥50 HAL ADCDMA单次触发转换
  • ¥15 关于#python#的问题:我知道这个问题对你们来说肯定so easy
  • ¥15 wpf datagrid如何实现多层表头
  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错