本题要求实现两个功能,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。
函数接口定义:
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
的学生,并返回结果链表的头指针。
输入样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0
80
输出样例:
2 wang 80
4 zhao 85
下面给出我的代码,欢迎斧正
#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* head = (struct stud_node*)malloc(sizeof(struct stud_node)); head->next = NULL; struct stud_node* p = head; int ty;scanf("%d",&ty); while(ty!=0)//尾插法创建链表 { p->next = (struct stud_node*)malloc(sizeof(struct stud_node)); p = p->next; scanf("%s %d",p->name,&p->score); p->num = ty; p->next = NULL; scanf("%d",&ty); } return head; } struct stud_node *deletelist( struct stud_node *head, int min_score ) { struct stud_node* p = head; while(p->next != NULL) { int flag = 0; if(p->next->score<min_score) { struct stud_node* temp = p->next; //printf("%d %d\n",temp->num,temp->score); p->next = temp->next; free(temp); flag = 1; } p = p->next; if(flag)//如果有删除节点,则重新开始,便于删除干净 p = head; } return head->next;//最终打印的时候直接从返回的head开始,需要跳过头结点 } 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; }