我正在学习使用linkedlist,我觉得我已经理解了这个概念,但是当编码的时候为什么我总是得到一个错误(总线错误)...这个代码可以运行,但是只有在“SCANF the NAME”之后出现错误。
typedef struct Student{
char name[20];
char idNum[10];
int saving;
struct Student *next;
}Student;
Student *head = NULL;
void insert_student(){
char *name,*idNum;
int saving;
Student *current;
Student *new_student;
new_student = (Student*)malloc(sizeof(Student));
// apakah ada memoory kosong?
if(new_student==NULL){
printf("==== YOUR MEMMORY IS FULL! ====\n");
exit(0);
}
printf("Enter your name : ");scanf("%[^\n]s",name);
printf("Enter your Id : ");scanf("%[^\n]s",idNum);
printf("How many your money : Rp");scanf("%d",&saving);
strcpy(new_student->name,name);
strcpy(new_student->idNum,idNum);
new_student->saving = saving;
new_student->next = NULL;
if(head==NULL){
head = new_student;
}
else{
current = head;
while (current->next != NULL)
{
current = current->next;
}
current->next = new_student;
}
}
void print_students(){
Student *current;
if(head==NULL){
printf("==== THERE IS NO STUDENT YET!\n");
exit(0);
}
current = head;
while (current!= NULL)
{
printf("Name : %s",current->name);
printf("id : %s",current->idNum);
printf("Saving : Rp%d",current->saving);
current = current->next;
}
}
int main(){
insert_student();
print_students();
return 0;
}
我希望为动态链接列表Student创建节点,然后显示它们
2条答案
按热度按时间z9zf31ra1#
在给予
named
和idNum
的值传递给scanf
之前,你必须给它们赋予有意义的值。相反,你只是将未初始化的垃圾值传递给scanf
,这是行不通的。你必须将指针传递给scanf
,指针指向你要阅读的字符串的位置。dgsult0t2#
对于初学者来说,让函数依赖于全局变量
head
是一个坏主意。在这种情况下,你将无法在程序中使用多个列表。在函数
insert_student
中,您声明了未初始化的指针name
和idNum
:所以在
scanf
的调用中使用它们调用未定义的行为。
需要声明字符数组而不是指针
格式规格也不正确。
你应该写
注意格式字符串中的前导空格它允许跳过白色字符。
否则,在调用scanf之后
输入缓冲区将包含换行符
'\n'
。因此,当您第二次调用函数insert_student
时,第一次调用scanf
(如果格式规范不包含前导空格)将读取空字符串。
此外,如果没有分配新节点,则整个程序退出,这也不是一种灵活的方法。
最好向调用者返回一个整数,以报告函数是否成功执行。