7-49 打印学生选课清单 (25 分)

1、邻接表

将学生作为结点,边表就是课程,但是所有学生信息是在最后输入的,不好处理。最后沿着这个思路,只能硬着头皮把课程当作结点,边表为各个课程。后续统计还要比较字符串查找边表。时间复杂度O(E+V),但是选课总数需要先输出,又要先遍历统计一遍,非常不优雅。

2、学生姓名映射地址

开始有这个思路,但是不想用定义好的集合和哈希,不优雅。

后来参考网上代码,一个非常优雅的方式:利用高维数组,将学生名各个字符作为1个维度,从而将学生名映射成唯一一个不冲突的地址。

/**
* Copyright(c)
* All rights reserved.
* Author : Sweeney He
* Date : 2021-02-07-21.21.36
* Description :
*/

#include <iostream>
#include <stdlib.h>
#include <cstring>
#include<stdio.h>
#define c2n(i) sname[i]-'A'
#define slink s[c2n(0)][c2n(1)][c2n(2)][sname[3]-'0']

using namespace std;


typedef struct NODE
{
    int lesson;
    struct NODE *next;
} listt,*List;

//注意理解这个递归插入,神奇之处在于可以往两边增加结点
List insertList(List cur,int lname)
{
 //先按从大到小,便于后续递归计算总数
 /**
    1.cur为空时:往最后插入
    2.课程编号大于当前结点课程编号时:往最前面插入,返回新结点指针
    3.否则指针后移与下一个结点比较。
**/
if(!cur||cur->lesson<lname)
    {
        List node = new listt();
        node->lesson = lname;
        node->next = cur;
        return node;
    }else //head课程编号小,往后放
        cur->next = insertList(cur->next,lname);
    return cur; //返回头指针
}


//递归输出顺便统计总数
void print(List l,int n=0)
{

    if(l)
    {
        print(l->next,++n);
        cout<<" "<<l->lesson;
    }
    else
        cout<<n;
}

List s[26][26][26][10];
int main()
{

    for(int i = 0 ; i<26 ; i++)
        for(int j = 0 ; j<26 ; j++)
            for(int k = 0 ; k<26 ; k++)
                for(int x = 0 ; x<10 ; x++)
                    s[i][j][k][x] = NULL;


    int sn,ln,lsn,lname;
    char sname[5]; //注意必须多定义1个,否则cin输入时超界溢出影响其他值,测试结果导致lname为0
    cin>>sn>>ln;
    for(int i = 0 ; i<ln ; i++)
    {
        cin>>lname>>lsn;
        for(int j = 0 ; j<lsn ; j++)
        {
            cin>>sname;
            slink = insertList(slink,lname);
        }
    }
    for(int i = 0 ; i<sn ; i++)
    {
        cin>>sname;
        cout<<sname<<" ";
        print(slink);
        cout<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学生选课系统是一个常见的应用程序,用于管理学生选课信息。在C语言中,可以使用文件操作和算法来实现学生选课系统的功能。 以下是一个简单的C语言学生选课系统的示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义课程结构体 typedef struct { char courseCode[10]; char courseName[50]; char courseProperty[20]; char semester[20]; int credit; } Course; // 定义学生结构体 typedef struct { char studentID[10]; char studentName[50]; Course courses[10]; int numCourses; } Student; // 函数声明 void displayMenu(); void searchCourse(Student* student); void displayCourseInfo(Student* student); void addCourse(Student* student); void removeCourse(Student* student); int main() { Student student; student.numCourses = 0; int choice; do { displayMenu(); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: searchCourse(&student); break; case 2: displayCourseInfo(&student); break; case 3: addCourse(&student); break; case 4: removeCourse(&student); break; case 5: printf("Exiting the program...\n"); break; default: printf("Invalid choice. Please try again.\n"); break; } } while (choice != 5); return 0; } // 显示菜单 void displayMenu() { printf("-- Student Course Registration System ---\n"); printf("1. Search course\n"); printf("2. Display course information\n"); printf("3. Add course\n"); printf("4. Remove course\n"); printf("5. Exit\n"); } // 搜索课程 void searchCourse(Student* student) { // 根据菜单选择查询字段,实现相应的查找算法 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Searching course...\n"); } // 显示课程信息 void displayCourseInfo(Student* student) { // 分屏显示课程信息,每屏10条课程记录,按任意键继续 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Displaying course information...\n"); } // 添加课程 void addCourse(Student* student) { // 添加课程到学生选课列表中 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Adding course...\n"); } // 移除课程 void removeCourse(Student* student) { // 从学生选课列表中移除课程 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Removing course...\n"); } ``` 这个示例中,我们使用了结构体来定义课程和学生的信息。通过菜单选择,可以进行课程的搜索、课程信息的显示、课程的添加和课程的移除等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值