QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

VIP至尊会员

Rank: 15Rank: 15Rank: 15

积分
119
查看: 154|回复: 3

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

[复制链接]
最佳答案
0 
累计签到:129 天
连续签到:30 天
知表不言 发表于 2017-7-16 22:55:04 1543 | 显示全部楼层 |阅读模式

马上注册加入鱼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);
}
最佳答案
2017-7-17 00:34:46

花了点时间
  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. }
复制代码
楼层
跳转到指定楼层
最佳答案
518 
累计签到:167 天
连续签到:21 天
ba21 发表于 2017-7-17 00:34:46 | 显示全部楼层    本楼为最佳答案   

花了点时间
  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. }
复制代码
最佳答案
0 
累计签到:129 天
连续签到:30 天
知表不言  楼主| 发表于 2017-7-18 07:19:41 | 显示全部楼层

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

打开后显示的还是:
是否想存入数字(Y/N):
最佳答案
518 
累计签到:167 天
连续签到:21 天
ba21 发表于 2017-7-18 08:49:31 | 显示全部楼层
知表不言 发表于 2017-7-18 07:19
宏定义不是只是机械的替换吗?
那为什么我在开头加上
#define X 1

机械的替换,替换你代码中的代码,不是字符串,或字符。

发表回复

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

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /1 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-11-23 17:35

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