QQ登录

只需一步,快速开始

搜索
【活动】边做笔记边学习,还能赢取奖学金!
查看: 64|回复: 3

[已解决]每次输入第二个数字就segmentation fault

[复制链接]
累计签到:14 天
连续签到:5 天
最佳答案
0 
发表于 7 天前 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

x
把GetNumber函数引用那一句注释掉或者仅输入一个数字结束输入就能正常完成程序。
#include <stdio.h>
#include <stdlib.h>

struct Number
{
        int num;
        struct Number *next;
};

void GetNumber(struct Number **ptr, int num);
void PrintNumbers(struct Number **ptr);
void FreeNumbers(struct Number **ptr);

int main()
{
        int new_num;
        char ch;
        struct Number *ptr = NULL;
        while(1)
        {
                printf("是否想存入数字(Y/N):");
                do
                {
                        scanf("%c", &ch);
                        fflush(stdin);
                }while(ch != 'Y' && ch != 'N');
                if(ch == 'Y')
                {
                        printf("请输入数字:");
                        scanf("%d", &new_num);
                        GetNumber(&ptr, new_num);
                }
                else
                {
                        break;
                }
        }
        fflush(stdin);
        if(ptr != NULL)
        {
                printf("是否想从小到大查看数字(Y/N):");
                do
                {
                        scanf("%c", &ch);
                        fflush(stdin);
                }while(ch != 'Y' && ch != 'N');
                if(ch == 'Y')
                {
                        printf("您输入的数字从小到大排序是:\n");
                        PrintNumbers(&ptr);
                }
                FreeNumbers(&ptr);
        }
        printf("感谢您的使用,再见!\n");
        return 0;
}

void GetNumber(struct Number **ptr, int num)
{
        struct Number *temp = *ptr;
        struct Number *previous = NULL;
        struct Number *new = (struct Number *)malloc(sizeof(struct Number));
        if(new == NULL) //判断申请内存是否成功
        {
                perror("malloc");
                exit(-1);
        }
        new->num = num;
        if((*ptr) == NULL)    //此处判断ptr也就相当于判断了temp不为NULL,所以下一段中的while至少循环一次
        {
                (*ptr) = new;
                new->next = NULL;
        }
        else
        {
                while(temp->num < num && temp != NULL)
                {
                        previous = temp;
                        temp = temp->next;
                }
                new->next = temp;
                previous->next = new;  //循环执行一次后previous就不为空了
        }
}

void PrintNumbers(struct Number **ptr)
{
        struct Number *temp = *ptr;
        do
        {
                printf("%d\t", temp->num);
                temp = temp->next;
        } while(temp != NULL);
        putchar('\n');
}

void FreeNumbers(struct Number **ptr)
{
        struct Number *temp;
        do
        {
                temp = *ptr;
                *ptr = (*ptr)->next;
                free(temp);
        } while(*ptr != NULL);
}

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
累计签到:44 天
连续签到:41 天
最佳答案
119 
发表于 6 天前 | 显示全部楼层    本楼为最佳答案   

花了点时间
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct Number
  4. {
  5.         int num;
  6.         struct Number *next;
  7. };

  8. void GetNumber(struct Number **ptr, int num);
  9. void PrintNumbers(struct Number **ptr);
  10. void FreeNumbers(struct Number **ptr);

  11. int main()
  12. {
  13.         int new_num;
  14.         char ch;
  15.         struct Number *ptr = NULL;
  16.         while(1)
  17.         {
  18.                 printf("是否想存入数字(Y/N):");
  19.                 do
  20.                 {
  21.                         scanf("%c", &ch);
  22.                         fflush(stdin);
  23.                 }while(ch != 'Y' && ch != 'N');
  24.                 if(ch == 'Y')
  25.                 {
  26.                         printf("请输入数字:");
  27.                         scanf("%d", &new_num);
  28.                         GetNumber(&ptr, new_num);
  29.                 }
  30.                 else
  31.                 {
  32.                         break;
  33.                 }
  34.         }
  35.         fflush(stdin);
  36.         if(ptr != NULL)
  37.         {
  38.                 printf("是否想从小到大查看数字(Y/N):");
  39.                 do
  40.                 {
  41.                         scanf("%c", &ch);
  42.                         fflush(stdin);
  43.                 }while(ch != 'Y' && ch != 'N');
  44.                 if(ch == 'Y')
  45.                 {
  46.                         printf("您输入的数字从小到大排序是:\n");
  47.                         PrintNumbers(&ptr);
  48.                 }
  49.                 FreeNumbers(&ptr);
  50.         }
  51.         printf("感谢您的使用,再见!\n");
  52.         return 0;
  53. }

  54. void GetNumber(struct Number **ptr, int num)
  55. {
  56.         struct Number *temp = *ptr;
  57.         struct Number *previous = NULL;
  58.         struct Number *new1 = (struct Number *)malloc(sizeof(struct Number));
  59.         if(new1 == NULL) //判断申请内存是否成功
  60.         {
  61.                 perror("malloc");
  62.                 exit(-1);
  63.         }
  64.         new1->num = num;
  65.         if(*ptr == NULL)    //此处判断ptr也就相当于判断了temp不为NULL,所以下一段中的while至少循环一次
  66.         {
  67.                 *ptr = new1;
  68.                 new1->next = NULL;
  69.         }
  70.         else
  71.         {
  72.                         while(temp != NULL && temp->num < num)
  73.                         {
  74.                         previous = temp;
  75.                         temp = temp->next;
  76.                         }
  77.                                        
  78.                         if (previous == NULL) //只有一个节点,num小,头插.
  79.                         {
  80.                                 *ptr = new1;
  81.                                 new1->next= temp;       
  82.                         }
  83.                         else
  84.                         {
  85.                                 if (previous->next == NULL) //最后一个节点
  86.                                 {
  87.                                         previous->next=new1;
  88.                                         new1->next=NULL;       
  89.                                 }
  90.                                 else//中间插
  91.                                 {
  92.                                         previous->next=new1;
  93.                                         new1->next=temp;
  94.                                 }
  95.                         }
  96.                        
  97.         }
  98. }

  99. void PrintNumbers(struct Number **ptr)
  100. {
  101.         struct Number *temp = *ptr;
  102.         do
  103.         {
  104.                 printf("%d\t", temp->num);
  105.                 temp = temp->next;
  106.         } while(temp != NULL);
  107.         putchar('\n');
  108. }

  109. void FreeNumbers(struct Number **ptr)
  110. {
  111.         struct Number *temp;
  112.         do
  113.         {
  114.                 temp = *ptr;
  115.                 *ptr = (*ptr)->next;
  116.                 free(temp);
  117.         } while(*ptr != NULL);
  118. }
复制代码
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
累计签到:14 天
连续签到:5 天
最佳答案
0 
 楼主| 发表于 5 天前 | 显示全部楼层

宏定义不是只是机械的替换吗?
那为什么我在开头加上
#define X 1
#define Y 2

打开后显示的还是:
是否想存入数字(Y/N):
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
累计签到:44 天
连续签到:41 天
最佳答案
119 
发表于 5 天前 | 显示全部楼层
知表不言 发表于 2017-7-18 07:19
宏定义不是只是机械的替换吗?
那为什么我在开头加上
#define X 1

机械的替换,替换你代码中的代码,不是字符串,或字符。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋手机版Archiver( 粤公网安备 44051102000370号 | 粤ICP备11014136号

© 2010-2017 FishC.com GMT+8, 2017-7-23 08:46 Powered by Discuz! X2.5 Theme by dreambred

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