#include
#include
#include
struct Num
{
int num;
struct Num *next;
};
int input_Num(struct Num *num)
{
printf("请输入一个数字: ");
scanf("%d", &num->num);
return num->num;
}
void insert_Num(struct Num **n)
{
struct Num *num;
struct Num *ptr;
struct Num *current;
int temp;
current = *n;
num = (struct Num *)malloc(sizeof(struct Num));
if (num == NULL)
{
printf("内存分配失败...\n");
exit(1);
}
temp = input_Num(num);
if (current != NULL)
{
while (current->num < temp && current != NULL)
{
ptr = current;
current = current->next;
}
num->next = current;
ptr->next = num;
}
else
{
num->next = NULL;
current = num;
}
}
void printRecord(struct Num *n)
{
struct Num *record;
record = n;
while (record != NULL)
{
printf("%d ", record->num);
record = record -> next;
}
}
void releaseRecord(struct Num **n)
{
struct Num *temp;
while (*n != NULL)
{
temp = *n;
*n = (*n)->next;
free(temp);
}
}
int main(void)
{
struct Num *n = NULL;
char ch;
while (1)
{
printf("是否录入数据(Y/N): ");
do
{
ch = getchar();
} while (ch != 'Y' && ch != 'N');
if (ch == 'N')
{
break;
}
else
{
insert_Num(&n);
}
}
printRecord(n);
releaseRecord(&n);
return 0;
}
你没有给n分配空间啊
给你改个有头节点的
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
struct Num
{
int num;
struct Num *next;
};
int input_Num(struct Num *num)
{
printf("请输入一个数字: ");
scanf("%d", &num->num);
num->next = NULL;
return num->num;
}
void insert_Num(struct Num **n)
{
struct Num *p;
struct Num *current;
int temp;
if(*n == NULL)
{
*n = (struct Num *)malloc(sizeof(struct Num));
(*n)->next = NULL;
}
current = (*n);
p = (struct Num *)malloc(sizeof(struct Num));
if (p == NULL)
{
printf("内存分配失败...\n");
exit(1);
}
input_Num(p);
while(current->next != NULL)
{
if(p->num < current->next->num)
current = current->next;
else
{
p->next = current->next;
current->next = p;
break;
}
}
if(current->next == NULL)
current->next = p;
}
void printRecord(struct Num *n)
{
struct Num *record;
record = n->next;
while (record != NULL)
{
printf("%d ", record->num);
record = record -> next;
}
}
void releaseRecord(struct Num **n)
{
struct Num *temp;
while (*n != NULL)
{
temp = *n;
*n = (*n)->next;
free(temp);
}
}
int main(void)
{
struct Num *n = NULL;
char ch;
while (1)
{
printf("是否录入数据(Y/N): ");
do
{
ch = getchar();
} while (ch != 'Y' && ch != 'N');
if (ch == 'N')
{
break;
}
else
{
insert_Num(&n);
}
}
printRecord(n);
releaseRecord(&n);
return 0;
}
头节点也需要分配内存,只要是指针就需要指向一片内存,可以动态分配,也可以指向现有的变量。
你这里的头节点n就没有给他指向过一片内存,你可以打印n的值看一看,里面肯定还是空指针null。
问题应该出在while循环中和下边几行。自己做一下测试或者用笔画一下。考虑第一次输入2,第二次输入5的情况。
还有,while循环的两个条件应该换一下位置,否则可能会导致访问空指针
题主的代码修改如下,不需要增加结点,改动处见注释,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
struct Num
{
int num;
struct Num *next;
};
int input_Num(struct Num *num)
{
printf("请输入一个数字: ");
scanf("%d", &num->num);
return num->num;
}
void insert_Num(struct Num **n)
{
struct Num *num = NULL;
struct Num *ptr = NULL;
struct Num *current = (*n); //修改 //current = *n;
int temp;
num = (struct Num *)malloc(sizeof(struct Num));
if (num == NULL)
{
printf("内存分配失败...\n");
exit(1);
}
temp = input_Num(num);
if (current != NULL)
{
while (current != NULL && current->num < temp)//修改
{
ptr = current;
current = current->next;
}
if (!ptr){ //修改
num->next = current; //修改
(*n) = num; //修改
}
else{
num->next = current;
ptr->next = num;
}
}
else
{
num->next = NULL;
(*n) = num; //修改
//current = num;
}
}
void printRecord(struct Num *n)
{
struct Num *record;
record = n;
while (record != NULL)
{
printf("%d ", record->num);
record = record -> next;
}
}
void releaseRecord(struct Num **n)
{
struct Num *temp;
while (*n != NULL)
{
temp = *n;
*n = (*n)->next;
free(temp);
}
}
int main(void)
{
struct Num *n = NULL;
char ch;
while (1)
{
printf("是否录入数据(Y/N): ");
do
{
ch = getchar();
} while (ch != 'Y' && ch != 'N');
if (ch == 'N')
{
break;
}
else
{
insert_Num(&n);
}
}
printRecord(n);
releaseRecord(&n);
return 0;
}