鱼C论坛

 找回密码
 立即注册
查看: 1985|回复: 16

[已解决]求助 单链表 倒插法

[复制链接]
发表于 2022-9-22 15:52:19 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
#include <stdlib.h>
struct Student
{
        char sname[10];
        int sno;
        int age;
        char ssex[2];
        int phone;
        struct Student *next;
};

void inget(struct Student *student)
{
        printf("请输入姓名:");
        scanf("%s",student->sname);
        printf("请输入年龄:");
        scanf("%d",&student->age);
        printf("请输入学号:");
        scanf("%d",&student->sno);
        printf("请输入性别:");
        scanf("%s",student->ssex);
        printf("请输入电话:");
        scanf("%d",&student->phone);
}

void addStudent(struct Student **head)
{
        struct Student *student;
        static struct Student *tail;
        student = (struct Student *)malloc(sizeof(struct Student));
        if(student == NULL)
        {
                printf("内存分配失败!\n");
                exit(1);
        }
        inget(student);
        if(*head != NULL)
        {
                tail->next = student; //应该是这里有问题,但看小甲鱼就是这么写的
                student->next = NULL;
        }
        else
        {
                *head = student;
                student ->next = NULL;
        }
        tail = student;
       
}
void printStudent(struct Student *head)
{
        while(head != NULL)
        {
                printf("姓名:%s\n",head->sname);
                printf("年龄:%d\n",head->age);
                printf("学号:%d\n",head->sno);
                printf("性别:%s\n",head->ssex);
                printf("电话:%d\n",head->phone);
                head = head ->next;
        }
}
void freeStudent(struct Student *head)
{       
        struct Student *temp;
        while(head != NULL)
        {
                temp = head;
                head = head -> next;
                free(temp);
        }
}
int main()
{
        struct Student *head;
        char ch;
        while(1)
        {       
                printf("请问是否需要录入数据(Y/N):");
                do
                {       
                        ch =getchar();
                }while(ch != 'Y'&&ch != 'N');
                if(ch == 'Y')
                {
                        addStudent(&head);
                }
                else
                {
                        break;
                }
        }
        printf("请问是否需要打印数据(Y/N):");
        do
        {
                ch = getchar();
        }while(ch != 'Y' && ch != 'N');
        if(ch == 'Y')
        {
                printStudent(head);
        }
        freeStudent(head);
       
}

错误如下:
VZ7@D7LRNZ6I}WK}O53N~OY.png
最佳答案
2022-9-22 16:55:13
本帖最后由 两手空空儿 于 2022-9-22 17:07 编辑
  1. int main()
  2. {
  3.     struct Student *head;
  4.     char ch;
  5.     while(1)
复制代码


head 没有初始化为NULL,是个野指针,所以加第一条的时候就出错!!!!

  1.    inget(student);
  2.     if(*head != NULL)      ////////////问题在这里,第一次调用的时候head的值不是NULL
  3.     {
  4.         tail->next = student; //应该是这里有问题,但看小甲鱼就是这么写的
  5.         student->next = NULL;
  6.     }
复制代码


tail的指针也是野的,以后凡是定义指针的时候就直接=NULL;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-22 16:03:59 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-22 16:32 编辑
  1. struct Student
  2. {
  3.         char sname[10];
  4.         int sno;
  5.         int age;
  6.         char ssex[2];    // 如果输入 '男' 那么,在 Linux 系统下,它需要占用 3 个字节,所以,ssex 必须至少要有 4 个字符空间,问题的根源就在这里 ;
  7.         int phone;
  8.         struct Student *next;
  9. };
复制代码

        ssex 成员存储空间定义小了,建议定义成 16 字节,或者,将此成员定义成整型数,用 1、0 来区分男女。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-22 16:36:29 | 显示全部楼层
jackz007 发表于 2022-9-22 16:03
ssex 成员存储空间定义小了,建议定义成 16 字节,或者,将此成员定义成整型数,用 1、0 来区分 ...

改成16字节还是错误哎
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 16:38:35 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-22 16:40 编辑
しお汐 发表于 2022-9-22 16:36
改成16字节还是错误哎


        编译、运行实况
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 请问是否需要录入数据(Y/N):Y
  4. 请输入姓名:徐小
  5. 请输入年龄:18
  6. 请输入学号:181
  7. 请输入性别:男
  8. 请输入电话:183
  9. 请问是否需要录入数据(Y/N):N
  10. 请问是否需要打印数据(Y/N):Y
  11. 姓名:徐小
  12. 年龄:18
  13. 学号:181
  14. 性别:男
  15. 电话:183

  16. D:\[00.Exerciese.2022]\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-22 16:48:15 | 显示全部楼层

啊?我改成ssex【16】还是报错啊你这是咋做到的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 16:54:38 | 显示全部楼层
しお汐 发表于 2022-9-22 16:48
啊?我改成ssex【16】还是报错啊你这是咋做到的

因为似乎 Windows 内核正常情况下的内存管理严格程度不及 Linux ,这位大佬提到的问题确实存在,但是问题并不止在这里。
请观察您判定链表为空的条件,您保证其在链表为空时一定成立吗?
(为了帮助您,您的代码保证链表为空时 head 一定为 NULL 了吗?)

评分

参与人数 1鱼币 +5 收起 理由
しお汐 + 5

查看全部评分

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

使用道具 举报

发表于 2022-9-22 16:55:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 两手空空儿 于 2022-9-22 17:07 编辑
  1. int main()
  2. {
  3.     struct Student *head;
  4.     char ch;
  5.     while(1)
复制代码


head 没有初始化为NULL,是个野指针,所以加第一条的时候就出错!!!!

  1.    inget(student);
  2.     if(*head != NULL)      ////////////问题在这里,第一次调用的时候head的值不是NULL
  3.     {
  4.         tail->next = student; //应该是这里有问题,但看小甲鱼就是这么写的
  5.         student->next = NULL;
  6.     }
复制代码


tail的指针也是野的,以后凡是定义指针的时候就直接=NULL;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 16:55:55 | 显示全部楼层
しお汐 发表于 2022-9-22 16:48
啊?我改成ssex【16】还是报错啊你这是咋做到的

         像我一样把编译、运行的屏幕信息贴出来看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 17:01:39 | 显示全部楼层
しお汐 发表于 2022-9-22 16:48
啊?我改成ssex【16】还是报错啊你这是咋做到的

        剩下可能有风险的语句是这里
  1. int main()
  2. {
  3.         struct Student *head;
复制代码

        改为
  1. int main()
  2. {
  3.         struct Student *head = NULL ;
复制代码

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

使用道具 举报

 楼主| 发表于 2022-9-22 17:05:40 | 显示全部楼层
两手空空儿 发表于 2022-9-22 16:55
head 没有初始化为NULL,是个野指针,所以加第一条的时候就出错!!!!

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

使用道具 举报

发表于 2022-9-22 17:13:17 | 显示全部楼层
本帖最后由 jhq999 于 2022-9-22 17:21 编辑

没毛病!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 18:43:17 | 显示全部楼层
我爱鱼C
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 19:07:46 | 显示全部楼层
有币!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-22 19:28:43 | 显示全部楼层
吐核
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-22 19:29:16 | 显示全部楼层
你这中奖概率10?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 19:29:58 | 显示全部楼层
服了你了
你真会设置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 19:31:14 | 显示全部楼层
貌似没听懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 03:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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