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

实验1  
输入若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束,用单向链表组织这些学生信息后,再按顺序输出。
输入:          输出:
1 zhang 78          1 zhang 78
2 wang 80           2 wang 80
3 li 75              3 li 75
4 zhao 85           4 zhao 85

0


#include <stdio.h>
#include <malloc.h>

struct node
{
    char name[10];
    int num,score;
    struct node *next;
};
struct node *create()
{
    printf("请输入学生的信息,以输入学号为0结束\n");
    printf("\t学号\t姓名\t分数\n");
    struct node *Head,*p,*tail;
    int date;
    Head = (struct node *)malloc(sizeof(struct node));
    Head->next = NULL;
    tail = Head;
    p = (struct node *)malloc(sizeof(struct node));
    p->next = NULL;
    while(scanf("%d",&date) != EOF)
 /*控制当学号为零就结束停止时,
                                      不能直接通过控制结点,因为
                                      那样会开辟一个结点,所以当输入为零
                                      时,必须输入姓名分数才行,所以,要设置一个
                                      变量,来控制分数的输入,当学号为零时,可
                                      直接停止*/
                       
    {
        if(date == 0) break;
        p->num = date;
        scanf("%s %d",p->name,&p->score);
        tail->next = p;
        tail = p;
        p = (struct node *)malloc(sizeof(struct node));
        p->next = NULL;
    }
    return Head;
}
void print(struct node *Head)
{
    printf("\t\t学生信息输出\n");
    printf("\t学号\t姓名\t分数\n");
    struct node *p;
    p = Head->next;
    while(p != NULL)
    {
        printf("\t%d\t%s\t%d\n",p->num,p->name,p->score);
        p = p->next;
    }
}
int main()
{
    struct node *head;
    head = create();
    print(head);
    return 0;
}


### 回答1: 好的,我明白了!以下是一个示例程序,可以实现您所描述的功能。请注意,由于我是一名英文语言模型,我的回答中可能会有一些拼写或语法错误,请您多多包涵。 ``` # 定义一个空字典,用于存储学生信息 students = {} # 循环输入学生信息 while True: student_id = input("请输入学号:") if student_id == "0": break # 输入 0 表示学生信息输入结束 student_name = input("请输入姓名:") student_score = input("请输入成绩:") # 将学生信息添加到字典中 students[student_id] = {"姓名": student_name, "成绩": student_score} # 按照学号顺序输出学生信息 sorted_ids = sorted(students.keys()) for student_id in sorted_ids: student = students[student_id] print(f"学号:{student_id},姓名:{student['姓名']},成绩:{student['成绩']}") ``` 在上面的程序中,我们首先定义了一个空字典 `students`,用于存储学生信息。然后,我们使用一个循环来反复输入学生信息,直到用户输入学号为 0,表示学生信息输入结束。在每次循环中,我们要求用户输入学号姓名成绩,并将这些信息以字典的形式添加到 `students` 字典中,其中学号作为键,姓名成绩作为值。最后,我们按照学号的顺序对字典进行排序,并依次输出每个学生信息。 ### 回答2: 这道题要求我们输入若干个学生信息,包括学号姓名成绩,并用单向链表组织起来,最后按照学号的顺序输出。下面我来详细解答一下。 首先,我们需要定义一个学生结构体,里面包含学号姓名成绩这三个元素。然后,我们再定义一个节点结构体,里面包含一个指向下一个节点的指针和一个指向学生结构体的指针。这样,我们就可以用一个单向链表来组织这些学生信息了。 接着,我们可以使用while循环来反复输入学生信息,每输入一个学生信息,就将其插入到链表中。如果输入学号为0,就结束输入过程。插入,我们可以按照学号的大小来插入,使链表中的学号按照从小到大的顺序排列。 最后,我们只需要按照链表节点的顺序,依次输出每个节点中的学生信息,即可完成输出任务。 下面是完整的代码实现,供参考: struct student { int id; char name[20]; int score; }; struct node { struct student* data; // 指向学生结构体的指针 struct node* next; // 指向下一个节点的指针 }; int main() { struct node* head = NULL; // 定义链表头指针 struct node* ptr = NULL; // 定义链表当前节点指针 while (1) { int id; printf("请输入学号输入0结束):"); scanf("%d", &id); if (id == 0) { break; // 输入0结束循环 } char name[20]; printf("请输入姓名:"); scanf("%s", name); int score; printf("请输入成绩:"); scanf("%d", &score); // 创建新的学生结构体,并将其赋值 struct student* s = malloc(sizeof(struct student)); s->id = id; strcpy(s->name, name); s->score = score; // 创建新的节点,并将其赋值 struct node* n = malloc(sizeof(struct node)); n->data = s; n->next = NULL; // 若链表为空,则将头指针指向新节点 if (head == NULL) { head = n; ptr = n; } // 否则,按照学号顺序将新节点插入链表中 else { if (n->data->id < head->data->id) { n->next = head; head = n; } else { struct node* prev = head; // 前一个节点指针 struct node* curr = head->next; // 当前节点指针 while (curr != NULL && curr->data->id <= n->data->id) { prev = curr; curr = curr->next; } prev->next = n; n->next = curr; } } } // 按照学号顺序依次输出链表中的学生信息 ptr = head; while (ptr != NULL) { printf("%d %s %d\n", ptr->data->id, ptr->data->name, ptr->data->score); ptr = ptr->nex; } return 0; } ### 回答3: 这道题目要求我们使用单向链表来组织学生信息,并按顺序输出。那么我们需要先了解一下单向链表的概念。 单向链表是一种基于指针的数据结构,由多个节点组成,每个节点包括两部分:数据域和指针域。数据域用于存储数据,指针域用于指向下一个节点。链表的头节点没有数据域,仅有一个指针域,指向第一个存放数据的节点。 在输入若干个学生信息,我们可以定义一个结构体来存储每个学生学号姓名成绩。然后,使用while循环来不断输入学生信息,每次输入完一个学生后,将其加入到单向链表的末尾。当输入学号为0,循环结束,所有学生信息都存储在了单向链表中。 接下来,我们需要按顺序输出单向链表中的所有学生信息。为了实现顺序输出,我们可以使用递归函数来遍历整个链表。从头结点开始,每访问一个节点就输出该节点的学生信息,然后进入下一个节点进行访问。由于链表是单向的,所以需要在访问完一个节点后,将指针指向下一个节点。递归函数的退出条件是指针为空。 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义学生结构体 struct student { int id; char name[20]; int score; struct student* next; }; // 创建链表并添加学生信息 struct student* create_list() { struct student* head, * p, * tail; head = (struct student*)malloc(sizeof(struct student)); tail = head; while (1) { p = (struct student*)malloc(sizeof(struct student)); printf("请输入学生学号姓名成绩(以空格分隔):"); scanf_s("%d", &p->id); if (p->id == 0) { free(p); break; } scanf_s("%s %d", p->name, sizeof(p->name), &p->score); tail->next = p; tail = p; } tail->next = NULL; return head; } // 遍历链表并输出学生信息 void print_list(struct student* p) { if (p == NULL) { return; } printf("学号:%d,姓名:%s,成绩:%d\n", p->id, p->name, p->score); print_list(p->next); } int main() { struct student* head; head = create_list(); printf("学生信息如下:\n"); print_list(head->next); return 0; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值