2-2 学生成绩链表处理 (20分)-HBU DS

    科技2024-12-06  49

    2-2 学生成绩链表处理 (20分)-HBU DS

    本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。

    函数接口定义:

    struct stud_node *createlist(); struct stud_node *deletelist( struct stud_node *head, int min_score );

    函数createlist利用scanf从输入中获取学生的信息,将其组织成单向链表,并返回链表头指针。链表节点结构定义如下:

    struct stud_node { int num; /*学号*/ char name[20]; /*姓名*/ int score; /*成绩*/ struct stud_node *next; /*指向下个结点的指针*/ };

    输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

    函数deletelist从以head为头指针的链表中删除成绩低于min_score的学生,并返回结果链表的头指针。

    裁判测试程序样例:

    #include <stdio.h> #include <stdlib.h> struct stud_node { int num; char name[20]; int score; struct stud_node *next; }; struct stud_node *createlist(); struct stud_node *deletelist( struct stud_node *head, int min_score ); int main() { int min_score; struct stud_node *p, *head = NULL; head = createlist(); scanf("%d", &min_score); head = deletelist(head, min_score); for ( p = head; p != NULL; p = p->next ) printf("%d %s %d\n", p->num, p->name, p->score); return 0; } /* 你的代码将被嵌在这里 */

    输入样例:

    1 zhang 78 2 wang 80 3 li 75 4 zhao 85 0 80

    输出样例:

    2 wang 80 4 zhao 85

    踩坑的地方

    我刚开始把scanf 学号 姓名 成绩放一块了,但是最后一个数据只输入一个学号(0),不输入姓名以及成绩。然后我找了半天bug!!!

    代码

    /* 你的代码将被嵌在这里 */ struct stud_node *createlist() { struct stud_node *L = (struct stud_node *)malloc(sizeof(struct stud_node)), *temp; L->next = NULL; temp = L; int num, sco; char name[20]; scanf("%d", &num); struct stud_node *currNode; while (num != 0) { scanf("%s %d", name, &sco); currNode = (struct stud_node *)malloc(sizeof(struct stud_node)); currNode->num = num; currNode->score = sco; int i; for (i = 0; name[i]; i++) currNode->name[i] = name[i]; currNode->name[i] = '\0'; currNode->next = NULL; temp->next = currNode; temp = temp->next; scanf("%d", &num); } return L->next; } struct stud_node *deletelist(struct stud_node *head, int min_score) { struct stud_node *L = (struct stud_node *)malloc(sizeof(struct stud_node)), *temp, *pre; L->next = head; temp = L->next; pre = L; while (temp) { if (temp->score < min_score) { pre->next = temp->next; free(temp); temp = pre->next; } else { pre = temp; temp = temp->next; } } return L->next; }
    Processed: 0.009, SQL: 8