鱼C论坛

 找回密码
 立即注册
查看: 1065|回复: 4

[已解决]程序报错一直找不到问题,求大神看看

[复制链接]
发表于 2020-2-20 20:39:00 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

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

#define LEN sizeof(struct Student)

struct Student *create();        //创建链表的函数
struct Student *del(struct Student *stu,int num);        //删除函数
void printStudent(struct Student *stu);                //打印数据的函数


int n;

void main()
{
        struct Student *stu,*p;        //定义一个指针接收head
        int a;

        stu=create();
        p=stu;
        printStudent(p);
       
        printf("input delete num:");
        scanf("%d",&a);
        printStudent(del(p,a));

}

struct Student *create()
{
        struct Student *p1,*p2,*head;

        p1=p2=(struct Student *)malloc(LEN);        //p1p2分配空间

        printf("please input student number:");
        scanf("%d",&p1->num);
        printf("please input the student score:");
        scanf("%d",&p1->score);

        n=0;                        //初始化n的值
        head=NULL;                //初始化head的值

        while(p1->num)
        {
                n++;
                if(n==1){
                        head=p1;        //head指向第一个结构
                }
                else{
                        p2->next=p1;        //前一个链接到后一个
                }
                p2=p1;                        //p2变成原本p1的值

                //p1开辟新的空间(结构)
                p1=(struct Student *)malloc(LEN);

                printf("please input student number:");
                scanf("%d",&p1->num);
                printf("please input the student score:");
                scanf("%d",&p1->score);
       
        }

        return head;        //返回头指针

}

void printStudent(struct Student *stu)        //打印数据
{
        struct Student *p;

        p=stu;
        do
        {
                printf("number:%d\n",p->num);
                printf("score:%d\n\n",p->score);
                p=p->next;
        }while(p->num);
}

struct Student *del(struct Student *stu,int num)
{
        struct Student *p1,*p2;

        if(stu == NULL)
        {
                printf("这是个空指针");
                goto END;
        }

        p1 = stu;
        while(p1->num != num && p1->next != NULL)
        {
                p2 = p1;
                p1 = p1->next;
        }
        if(num == p1->num)
        {

                if(p1 == stu)
                {
                        stu = p1->next;
                }
                else
                {
                        p2->next=p1->next;
                }

                printf("\ndelete num:%d succeed\n",num);
                n=n-1;
        }
        else
        {
                printf("%d not been found!\n",num);
        }

END:
        return stu;
}
最佳答案
2020-2-20 23:51:12
我发现
问题一:
个人感觉看不懂的是从create开始的,如果num不等于0,你怎么让这个创建结束呢?
如果第一个创建的num为0,你的head根本就没有 head=p1; 就直接return head,导致后面直接返回的指针其实为null,那么你再用指针必然报错
QQ截图20200220234140.png
问题二:
  1.      if(n==1){
  2.                         head=p1;        //head指向第一个结构
  3.                 }
  4.                 else{
  5.                         p2->next=p1;        //前一个链接到后一个
  6.                 }
  7.                 p2=p1;                        //p2变成原本p1的值
复制代码

这个逻辑我有点看不明白
head=p1
那么head->next=什么?
然后  p2->next=p1;  接着p2=p1,新的p2也就是p1->next是什么呢?
个人觉得,是你create的问题导致了后面的问题,建议在create断点,看看你的p1、p2还有head到底怎么回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-20 21:09:13 | 显示全部楼层
有没有人啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 21:13:05 | 显示全部楼层
在void printStudent(struct Student *stu)这个函数运行完,
while(p->num)这里报错。
下面是报错内容
First-chance exception in kh.exe: 0xC0000005: Access Violation.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 23:51:12 | 显示全部楼层    本楼为最佳答案   
我发现
问题一:
个人感觉看不懂的是从create开始的,如果num不等于0,你怎么让这个创建结束呢?
如果第一个创建的num为0,你的head根本就没有 head=p1; 就直接return head,导致后面直接返回的指针其实为null,那么你再用指针必然报错
QQ截图20200220234140.png
问题二:
  1.      if(n==1){
  2.                         head=p1;        //head指向第一个结构
  3.                 }
  4.                 else{
  5.                         p2->next=p1;        //前一个链接到后一个
  6.                 }
  7.                 p2=p1;                        //p2变成原本p1的值
复制代码

这个逻辑我有点看不明白
head=p1
那么head->next=什么?
然后  p2->next=p1;  接着p2=p1,新的p2也就是p1->next是什么呢?
个人觉得,是你create的问题导致了后面的问题,建议在create断点,看看你的p1、p2还有head到底怎么回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-21 13:47:06 | 显示全部楼层
4goodworld 发表于 2020-2-20 23:51
我发现
问题一:
个人感觉看不懂的是从create开始的,如果num不等于0,你怎么让这个创建结束呢?

我重新检查了一下
确实create这有问题就是你说的->next的问题

  1. do
  2.         {
  3.                 printf("number:%d\n",p->num);
  4.                 printf("score:%d\n\n",p->score);
  5.                 p=p->next;
  6.         }while(p->num);
复制代码

还有这个条件也改成while(p)
感谢大佬的帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 16:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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