我在搜索链表时遇到问题。我正在制作成绩簿计划,我正在进行输入错误检查以查看用户是否已输入现有课程以注册学生参加所述课程。
所以这是带有双向链表的课程信息的结构。
struct
及其对应的变量以及初始化。
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;
我目前的问题是它只搜索链表的第一个元素。如何制作一个检查整个链表的循环?
答案 0 :(得分:1)
迭代链表非常简单。
您需要使用一个局部变量,该变量是列表的当前元素,您可以将其初始化为Courses-> Course_Head,例如:
Course* current = Courses->Course_Head;
然后直到current != NULL
你只是不断更新当前指向下一个元素,例如:
while (current != NULL) {
// do what your want with current
current = current->next;
}
请注意,在您的示例中,您讲的是双向链接列表,但它是带有两个指向头部和尾部的单个链接列表,双链表在两个方向上都有两个指针,以便您可以遍历它的顺序是相反的,在你的情况下并非如此。
答案 1 :(得分:0)
ListCourse * current = Courses->Course_Head;
while ( (NULL != current) && (CID != current->Course_ID) ) current = current->next;
if (NULL == current) printf("Course %d not found\n", CID);
else printf("Course %d found\n", CID);
你的问题是你没有遍历列表,而只是检查列表头。您需要维护一个指向您正在检查的节点的指针并对其进行迭代(将其指向下一个节点),以防您找不到所需的内容。如果没有任何内容可以搜索,或者您找到了要查找的内容,则退出。