建立学生信息链表 (20分)

本文介绍了一个简单的函数,用于将学生的成绩信息(包括学号、姓名和成绩)组织成单向链表。该函数读取输入直到学号为0,适用于C语言初学者理解和实践链表操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。
函数接口定义:

void input();

单向链表的头尾指针保存在全局变量head和tail中。

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

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stud_node {
     int    num;
     char   name[20];
     int    score;
     struct stud_node *next;
};
struct stud_node *head, *tail;

void input();

int main()
{
    struct stud_node *p;
	
    head = tail = NULL;
    input();
    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

输出样例:

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

通过代码:

void input(){
	struct stud_node *p;
	int x;
	scanf("%d",&x); //先判断输入是否为0,再分配空间
	while(x){
		p = (struct stud_node*)malloc(sizeof(struct stud_node));
		p -> num = x;
		scanf("%s %d", p->name, &p->score);
		p -> next = NULL;
		if(head == NULL)	head = p; //让haed等于p
		else	tail -> next = p;  //将p连接到链表结尾
		tail = p;  //将tail后移
		scanf("%d",&x);
	}
}
### 使用链表存储学生信息实现方法 在实现学生信息管理系统时,可以采用链表来组织和管理数据。以下是一个完整的实现思路和代码示例: #### 1. 数据结构定义 为了存储学生信息,首先需要定义一个结构体 `student` 来表示单个学生信息[^2]。然后,定义另一个结构体 `studentNode` 表示链表中的节点,每个节点包含一个 `student` 类型的数据域和一个指向下一个节点的指针。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define NAME_LEN 50 typedef struct { char name[NAME_LEN + 1]; // 姓名 int number; // 学号 int chinese; // 语文成绩 int math; // 数学成绩 int english; // 英语成绩 int average; // 平均 int sum; // 总 } student; typedef struct StudentNode { student data; // 数据域 struct StudentNode* next; // 指针域 } studentNode; ``` #### 2. 创建链表 创建链表时,可以通过动态内存配为每个节点配空间,并将节点链接起来形成链表。 ```c // 创建一个新的学生节点 studentNode* createStudentNode(student stu) { studentNode* newNode = (studentNode*)malloc(sizeof(studentNode)); if (newNode == NULL) { printf("内存配失败!\n"); return NULL; } newNode->data = stu; newNode->next = NULL; return newNode; } ``` #### 3. 插入学生信息 插入学生信息时,可以在链表的末尾添加新的节点。 ```c // 在链表末尾插入学生节点 void insertStudent(studentNode** head, student stu) { studentNode* newNode = createStudentNode(stu); if (*head == NULL) { *head = newNode; } else { studentNode* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } } ``` #### 4. 遍历链表并显示学生信息 通过遍历链表,可以输出所有学生信息。 ```c // 显示链表中的所有学生信息 void displayStudents(studentNode* head) { studentNode* temp = head; while (temp != NULL) { printf("姓名: %s, 学号: %d, 语文: %d, 数学: %d, 英语: %d, 总: %d, 平均: %d\n", temp->data.name, temp->data.number, temp->data.chinese, temp->data.math, temp->data.english, temp->data.sum, temp->data.average); temp = temp->next; } } ``` #### 5. 删除学生信息 删除指定学号的学生信息时,需要找到对应的节点并调整指针。 ```c // 根据学号删除学生信息 void deleteStudent(studentNode** head, int number) { studentNode* temp = *head; studentNode* prev = NULL; while (temp != NULL && temp->data.number != number) { prev = temp; temp = temp->next; } if (temp == NULL) { printf("未找到学号为 %d 的学生。\n", number); return; } if (prev == NULL) { *head = temp->next; } else { prev->next = temp->next; } free(temp); printf("已删除学号为 %d 的学生。\n", number); } ``` #### 6. 计算总和平均 在插入学生信息时,可以计算总和平均并存储到结构体中。 ```c // 计算总和平均 void calculateScores(student* stu) { stu->sum = stu->chinese + stu->math + stu->english; stu->average = stu->sum / 3; } ``` #### 7. 主函数示例 以下是一个简单的主函数示例,展示如何使用上述功能。 ```c int main() { studentNode* head = NULL; student s1 = {"张三", 101, 85, 90, 88, 0, 0}; student s2 = {"李四", 102, 92, 88, 95, 0, 0}; calculateScores(&s1); calculateScores(&s2); insertStudent(&head, s1); insertStudent(&head, s2); printf("当前学生信息:\n"); displayStudents(head); printf("\n删除学号为 101 的学生信息:\n"); deleteStudent(&head, 101); printf("当前学生信息:\n"); displayStudents(head); return 0; } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值