怎么初始化结构体数组,并输出自己寝室同学信息(学号、姓名、性别、兴趣爱好)

初始化结构体数组,并输出自己寝室同学信息(学号、姓名、性别、兴趣爱好)

把下面代码换成你实际的同学即可

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

// 定义学生结构体
struct Student {
    int studentID;
    char name[50];
    char gender;
    char hobby[100];
};

int main() {
    // 初始化结构体数组
    struct Student students[3];
    
    // 学生1信息
    students[0].studentID = 1;
    strcpy(students[0].name, "张三");
    students[0].gender = 'M';
    strcpy(students[0].hobby, "篮球");

    // 学生2信息
    students[1].studentID = 2;
    strcpy(students[1].name, "李四");
    students[1].gender = 'F';
    strcpy(students[1].hobby, "音乐");

    // 学生3信息
    students[2].studentID = 3;
    strcpy(students[2].name, "王五");
    students[2].gender = 'M';
    strcpy(students[2].hobby, "游戏");

    // 输出学生信息
    for (int i = 0; i < 3; i++) {
        printf("学号: %d", students[i].studentID);
        printf("姓名: %s", students[i].name);
        printf("性别: %c", students[i].gender);
        printf("兴趣爱好: %s", students[i].hobby);
        printf("\n");
    }
    
    return 0;
}

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7437363
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:排序算法——插入排序(直接插入排序、折半插入排序、希尔排序)
  • 除此之外, 这篇博客: 线性表中链表,顺序表,链栈,顺序栈的异同中的 本文侧重于比较链表,顺序表,链栈及顺序栈实现方式上的异同及头,尾结点的区别。(本文参考的类型基于学校教材) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 首先比较链表和顺序表的总体差异:
    链表是含有头结点,且一般头结点不存储数据或只存储长度等附加信息。尾结点存储数据且尾结点的指针域指向空。实现方法多为对已经定义的结构体指针进行动态分配并作为头结点,之后再进行各类操作。

    引用https://blog.csdn.net/oqqHuTu12345678/article/details/52677935中的总结:

    其实若有足够多的结构体,无需动态分配也可以创建链表,但这违背了动态扩展的初衷,另外,直接在全局定义的结构体,存储在静态存储区;在函数内定义的结构体,存储在栈区;而使用malloc来申请空间的结构体,存储在堆空间中。链表一般都放在堆空间中。

    静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

    栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

    堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。

    顺序表含有头结点与尾结点,且头尾结点皆存储数据。实现方法为对已经定义的结构体中的指针变量进行动态分配

    接下来我们分别了解下顺序表和链表中栈与队列的异同。

    1.顺序栈
    实现方法:其定义的结构体(设结构体名为S)中普遍包含base与top这两个指针变量(base作为栈底,top作为栈顶),一般对S.base进行动态分配,而base存储数据,top指向栈顶元素的下一个空间,无数据。(这样做方便通过判定top=base是否成立,来判断是否空栈)

    2.顺序队列
    由于其先进先出的特点,不同于栈,队列的顺序实现其实是一种循环队列。
    实现方式:对结构体中(设名为Q)的base指针进行动态分配,而队头front与队尾rear,则以int形式来表示,即单纯看作一个记号来充当“指针”,而非真正的指针变量。此外,不同于栈可以通过top=base的判定来进行空栈判断,顺序队列由于其循环的特性,满栈时front=rear同样成立。为了避免混淆,通常牺牲一个空间来进行判定,即队列Q的最大存储数据量为实际申请量-1(此处不考虑malloc可能额外申请的空间)

    3.链栈
    实现方法同链表,但是其头结点是有数据的。另外,链栈的指针next是从栈顶指向栈底的,这意味这在初始化函数中需要先定义栈顶作为"第一个"结点。与逻辑上“先为栈底元素开空间”的想法不同。

    4.链队列
    链队列较为特殊,由于结构体Q中只存在数据及表示结点之间关系的指针next,头指针和尾指针需要在另一个结构体内定义,即总共需要两个结构体(或者也可以直接定义全局变量)且头结点无数据,尾结点有数据。
    实现方法:对于头指针和尾指针进行动态分配(一开始指向同一地址),Q存储数据和指针域。

    总结:不同于顺序表,顺序栈和顺序队列都是头结点有数据,尾结点无数据。而链队列与链表的头尾结点特点基本一致,都是头结点不存而尾结点存,但链队列任一结点都存储数据。

    本文参考栈与队列的特点基于学校教材,供交流复习使用,若有理解不到位或错误处,希望各位在评论区指正。

  • 您还可以看一下 李月喜老师的企业微信开发第三方应用开发篇课程中的 回调配置概述,回调签名验证及消息解密集成 小节, 巩固相关知识点