我現在有一個鏈表,需要將數據添加到它是由鍵盤,使用戶輸入節點添加到鏈接列表我有兩個結構:使用功能
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