需要帮助检查C中的链接列表



我在搜索链表时遇到问题。我正在制作一个成绩册程序,并进行输入错误检查,以查看用户是否输入了现有课程来招收学生参加该课程。

这就是课程信息的结构,有一个双链表。

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);

您的问题是,您不是在列表上迭代,而是只检查列表头。您需要维护一个指向正在检查的节点的指针,并对其进行迭代(将其指向下一个节点(,以防找不到要查找的内容。如果没有可搜索的内容,或者您找到了要查找的内容,则退出。

相关内容

  • 没有找到相关文章

最新更新