я в настоящее время есть связанный список и нужно добавить в него данные, которые вводятся пользователем с клавиатуры так у меня есть два структур:добавления узла в связанный список, используя функцию
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 узлами в настоящее время. Затем мне нужно вызвать функцию и добавить узел. Узел должен быть вставлен в правильное место, в котором идентификатор studentID должен быть меньше его, а идентификатор studentID после этого должен быть больше, поэтому текущие идентификаторы, которые у меня есть, - 111111111, 333333333 и 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
заявления, потому что я хотел понять, почему программа терпела крах. Таким образом, оператор puts puts("Inside a different else")
застревает в бесконечном цикле и сохраняет печать. Функция searchStudentID просто возвращает 1, если у нас уже нет идентификатора и 0, если мы уже имеем его. Я знаю, что эта функция работает, поэтому нет необходимости публиковать ее.
Я думаю, что проблема может быть в перерыве; заявление, потому что оно не выход из первого во время цикла, но только выходит из внутреннего цикла, но им не positive.The вызов этой функции выглядит следующим образом:
list = addStudent(list); //Now the new data is stored in list
Где список связанный список с 3-мя узлами
Прошел ли вы через код с отладчиком – pm100
@ pm100 В настоящее время я использую code :: blocks и когда я строю и запускаю, я не получаю ошибок – JackV
Несвязанное последнее сообщение в предложении else должно читать: «Найдено id * и утечка памяти * «Что касается реальной проблемы (проблем), достаточно сказать, что вы это делаете:' data = (ничего) 'означает * ничего * обратно на стороне вызывающей стороны этой функции. – WhozCraig