我现在有一个链表,需要将数据添加到它是由键盘,使用户输入节点添加到链接列表我有两个结构:使用功能
struct CourseInfo {
int courseID;
char courseName[30];
};
typedef struct CourseInfo courseinfo;
struct StudentInfo {
char StudentID[10];
char FirstName[21];
char LastName[26];
int num_course;
courseinfo array[10];
struct StudentInfo *next;
};
所以我目前有3个节点的链表。然后我需要调用一个函数并添加一个节点。节点需要被插入到正确的地方,这就是说,学生ID之前,它需要小于它和学生ID后需要更大,所以目前的ID我有111111111,3333333333和444444444和即时试图添加222222222所以它会走在第二位,所以我的函数看起来像:
studentinfo *addStudent(studentinfo *data) //returns type studentinfo* now
{
studentinfo *add;
add = malloc(sizeof(studentinfo));
add->next = NULL; //Now its set to NULL to begin
int knt;
printf("%s", "Adding new student:\nStudent ID: ");
scanf("%s", add->StudentID);
printf("%s", "First Name: ");
scanf("%s", add->FirstName);
printf("%s", "Last Name: ");
scanf("%s", add->LastName);
printf("%s", "Number of courses: ");
scanf("%d", &add->num_course);
for(knt = 0; knt < add->num_course; knt++) {
printf("%s", "Course ID: ");
scanf("%d", &add->array[knt].courseID);
printf("%s", "Course Name: ");
scanf("%s", add->array[knt].courseName);
}
if(searchStudentID(data, add->StudentID)) {
puts("immediately inside if");
while(data != NULL) {
puts("Immediately inside while");
if(strcmp(add->StudentID, data->StudentID) < 0) {
puts("inside if");
add->next = data;
data = add;
}
else {
puts("inside first else");
studentinfo *PrevPtr = data;
studentinfo *NPtr = data->next;
while(NPtr != NULL) {
("inside while(NPTR != NULL)");
if(strcmp(add->StudentID, NPtr->StudentID) < 0) {
add->next = PrevPtr;
PrevPtr->next = add;
break;
}
else {
puts("inside a differnet else");
PrevPtr = NPtr;
NPtr = NPtr->next;
}
}
if(PrevPtr->next == NULL) {
puts("inside last if");
add->next = NULL;
PrevPtr->next = add;
}
}
}
}
else {
puts("Found id");
}
return data; //returns data back to call
}
,所以我说那些puts
语句,因为我想看看为什么程序保持崩溃。所以put语句puts("Inside a different else")
卡住了一个无限循环并且保持打印。如果我们没有ID,函数searchStudentID只返回1,如果我们已经有了它,则返回0。我知道这个功能可以工作,所以不需要发布它。
我觉得问题可能在休息;语句,因为它不退出第一while循环,但是从内环唯一的退出,但我不是阳性。调用该函数的样子:
list = addStudent(list); //Now the new data is stored in list
其中list是3个节点
您是否使用调试器遍历代码 – pm100 2015-04-02 21:01:17
@ pm100我目前使用的是code :: blocks,当我构建并运行时,我没有遇到错误 – JackV 2015-04-02 21:02:42
无关,else子句中的最后一条消息应为:“Found id *和泄漏的内存*“关于实际问题,可以在任何地方说出来:'data =(anything)'意味着这个函数的调用者端没有任何东西。 – WhozCraig 2015-04-02 21:07:11