鱼C论坛

 找回密码
 立即注册
查看: 1775|回复: 3

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

[复制链接]
发表于 2017-7-16 22:55:04 | 显示全部楼层 |阅读模式

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

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

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

花了点时间
#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 *new1 = (struct Number *)malloc(sizeof(struct Number));
        if(new1 == NULL) //判断申请内存是否成功
        {
                perror("malloc");
                exit(-1);
        }
        new1->num = num;
        if(*ptr == NULL)    //此处判断ptr也就相当于判断了temp不为NULL,所以下一段中的while至少循环一次
        {
                *ptr = new1;
                new1->next = NULL;
        }
        else
        {
                        while(temp != NULL && temp->num < num)
                        {
                        previous = temp;
                        temp = temp->next;
                        }
                                        
                        if (previous == NULL) //只有一个节点,num小,头插.
                        {
                                *ptr = new1;
                                new1->next= temp;        
                        }
                        else
                        {
                                if (previous->next == NULL) //最后一个节点
                                {
                                        previous->next=new1;
                                        new1->next=NULL;        
                                }
                                else//中间插
                                {
                                        previous->next=new1;
                                        new1->next=temp;
                                }
                        }
                        
        }
}

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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-17 00:34:46 | 显示全部楼层    本楼为最佳答案   

花了点时间
#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 *new1 = (struct Number *)malloc(sizeof(struct Number));
        if(new1 == NULL) //判断申请内存是否成功
        {
                perror("malloc");
                exit(-1);
        }
        new1->num = num;
        if(*ptr == NULL)    //此处判断ptr也就相当于判断了temp不为NULL,所以下一段中的while至少循环一次
        {
                *ptr = new1;
                new1->next = NULL;
        }
        else
        {
                        while(temp != NULL && temp->num < num)
                        {
                        previous = temp;
                        temp = temp->next;
                        }
                                        
                        if (previous == NULL) //只有一个节点,num小,头插.
                        {
                                *ptr = new1;
                                new1->next= temp;        
                        }
                        else
                        {
                                if (previous->next == NULL) //最后一个节点
                                {
                                        previous->next=new1;
                                        new1->next=NULL;        
                                }
                                else//中间插
                                {
                                        previous->next=new1;
                                        new1->next=temp;
                                }
                        }
                        
        }
}

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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-18 07:19:41 | 显示全部楼层

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

打开后显示的还是:
是否想存入数字(Y/N):
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-18 08:49:31 | 显示全部楼层
知表不言 发表于 2017-7-18 07:19
宏定义不是只是机械的替换吗?
那为什么我在开头加上
#define X 1

机械的替换,替换你代码中的代码,不是字符串,或字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 17:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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