我在搜索链表时遇到问题。我正在制作一个成绩册程序,并进行输入错误检查,以查看用户是否输入了现有课程来招收学生参加该课程。
这就是课程信息的结构,有一个双链表。
typedef struct Course_Info // Course information
{
int Course_ID;
char Course_Name[15];
struct Course_Info *next;
} Course;
typedef struct // Linked list for Course
{
int Ctracker; // Keeps track of courses
Course *Course_Head;
Course *Course_Tail;
} List_Course;
以及它们相应的初始化变量。
List_Student Students;
List_Course Courses;
Grade_List Grades;
Students.Stracker = 0;
Students.Student_Head = Students.Student_Tail = NULL;
Courses.Ctracker = 0;
Courses.Course_Head = Courses.Course_Tail = NULL;
Grades.Grade_cnt = 0;
Grades.Grade_Head = Grades.Grade_Tail = NULL;
在这个功能中,我将为一名学生注册一门课程,但首先我将进行一些输入检查,以确保该课程存在。
void EnrollStudent(List_Course *Courses, List_Student *Students)
{
int CID; int SID;
printf("Enter course ID: ");
scanf("%d%*c", &CID);
if( CID != Courses -> Course_Head -> Course_ID)
{
printf("Course does not exist!n");
return;
}
else
{
printf("Found class!n");
}
}
我目前的问题是它只搜索链表的第一个元素。我该如何做一个循环来检查整个链表?
迭代链表非常简单。
您需要使用一个局部变量,它是列表的当前元素,您将其初始化为Courses->Course_Head,例如:
Course* current = Courses->Course_Head;
然后直到current != NULL
,你只需要不断更新当前元素以指向下一个元素,例如:
while (current != NULL) {
// do what your want with current
current = current->next;
}
请注意,在您的示例中,您谈到的是一个双链表,但它是一个有两个指向头和尾的指针的单链表,双链表在两个方向上为每个节点都有两个指针,因此您可以按相反的顺序遍历它,但在您的情况下并非如此。
ListCourse * current = Courses->Course_Head;
while ( (NULL != current) && (CID != current->Course_ID) ) current = current->next;
if (NULL == current) printf("Course %d not foundn", CID);
else printf("Course %d foundn", CID);
您的问题是,您不是在列表上迭代,而是只检查列表头。您需要维护一个指向正在检查的节点的指针,并对其进行迭代(将其指向下一个节点(,以防找不到要查找的内容。如果没有可搜索的内容,或者您找到了要查找的内容,则退出。