我得到的错误是分段错误11。
这个想法是将节点添加到 C
中的排序列表中我遇到的问题是在插入第一个节点(这意味着列表不再为空(之后,也就是我收到错误的时候:
inserted John
|23,John|
Segmentation fault: 11
不起作用的是当我尝试在列表不为空时插入新的节点节点时。
这是我的代码:
typedef struct StudentListNodeStruct{
int id;
char name[32] ;
struct StudentListNodeStruct *next;
} StudentListNode;
struct StudentListNode *head = NULL;
int insertStudent(StudentListNode **list, int id, char *name){
StudentListNode *newStudent = (StudentListNode*) malloc (sizeof(StudentListNode));
strcpy((*newStudent).name, *&name);
newStudent -> next = NULL;
StudentListNode *current = head;
StudentListNode *previous;
if(findStudent(list,id,name)==0){
return(1);
}
if(head == NULL){
newStudent -> next == newStudent;
head = newStudent;
return(0);
}
//This while statement is what isn't working
while(current -> next != NULL && newStudent -> id < id){
previous = current;
current = current -> next;
}
previous -> next = newStudent;
newStudent -> next = current;
}
int findStudent(StudentListNode *list, int id, char *name){
StudentListNode *current = head;
while(current != NULL){
if(current -> id == id){
return (0);
}
current = current -> next;
}
return (1);
int printList(StudentListNode *list){
StudentListNode *temp = head;
if(temp == NULL){
printf("(empty list)n");
}
//start from the beginning
while(temp != NULL) {
printf("|%d,%s|n",temp->id,temp->name);
temp = temp->next;
}
}
TL;博士:
- 阅读 1。
- 阅读 2。
- 阅读解决方案
- C 很令人沮丧,但它很有趣。
几件事:
- 你不需要强制转换 malloc 的返回值,因为它 返回一个空指针。
- (*newStudent(.name 等同于 newStudent->name。(即, 取消引用新学生指针并获取名称成员 的 StudentListNode 结构(。
您的段错误问题(我认为(:"*&name"本质上是要求尊重变量名的地址。请记住,&varname 会给你变量 varname 的地址,而指向地址的指针,当取消引用时,将"跟随"内存中"列出"在变量名下的地址。
溶液:strcpy 接受两个参数(两个指向字符串的指针( 所以你可以发送strcpy(新学生->姓名,姓名(
但在此之前,您需要在结构体 newStudent 中对字符串名称进行 malloc。
即,newStudent.name = malloc(sizeof(char(*sizeof(name((,或者因为 sizeof(char( = 1, newStudent.name = malloc(sizeof(name((.
注意:如果你使用了malloc(strlen(name((,你需要考虑空终止符,即malloc(strlen(name( + 1(。但是大小会为你计算这个。