【C言語/PTA】生徒情報リストを作成する

【C言語/PTA】生徒情報リストを作成する

トピックの要件

この質問では、入力された生徒の成績を一方向のリンク リストに整理する単純な関数の実装が必要です。

関数インターフェースの定義:

void input();

この関数は、scanf を使用して入力から生徒の情報を取得し、それを単一リンクのリストに編成します。リンク リストのノード構造は次のように定義されます。

struct stud_node {
    
    
    int              num;      /*学号*/
    char             name[20]; /*姓名*/
    int              score;    /*成绩*/
    struct stud_node *next;    /*指向下个结点的指针*/
};

一方向リンクリストの先頭ポインタと末尾ポインタは、グローバル変数 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 張 78
2 王 80
3 李 75
4 趙 85
0

出力例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85

問題解決のアイデア

指定されたコードと組み合わせると、コード関数は次のように分析できます。

この構造体を使用して、学生番号、名前、スコア、次のノードを指すポインタ メンバー変数などの学生情報ノードを定義します。

この機能は、ユーザーが入力した生徒情報を読み取り、動的にノードを作成し、末尾挿入方法に従ってリンクリストに挿入するためvoid input()に使用されます。

main 関数main()でこの関数を呼び出してinput()リンク リストを作成し、 を使用してリンク リストをforループして各ノードのデータを出力します。

コード

void input()
{
    
    
    struct stud_node *q;                // 定义临时指针变量 q,用于操作新的节点
    int len=0;                          // 定义链表中节点数(即长度)的计数器,初始值为 0

    q = (struct stud_node*)malloc(sizeof(struct stud_node));    // 在动态内存中分配新的节点空间
    q->next = NULL;                     // 将指针成员变量初始化为 NULL,表示当前节点是末尾节点
    scanf("%d ",&q->num);               // 从键盘上读入学号
    while ( q->num != 0 )               // 如果输入的学号不为 0,说明还有待创建的新节点
    {
    
    
        len++;                          // 计数器加 1,表示又成功创建了一个新节点
        scanf("%s %d",q->name,&q->score);   // 从键盘上读入姓名和分数,并存储到链表节点中

        // 根据链表节点数 len 来判定是头插法还是尾插法
        if ( len == 1 )                 // 如果当前是第一个节点,直接将头指针和尾指针都指向该节点
        {
    
    
            head = q;
            tail = q;
            tail->next = NULL;          // 将尾指针的 next 成员变量初始化为 NULL,表示当前节点是末尾节点
        }
        else                            // 否则,使用尾插法将新节点插入到链表末尾
        {
    
    
            tail->next = q;             // 将尾指针指向的节点的 next 成员变量指向 q,即当前新节点
            tail = q;                   // 尾指针更新为当前节点
            tail->next = NULL;          // 将尾指针的 next 成员变量初始化为 NULL,表示当前节点是末尾节点
        }

        q = (struct stud_node*)malloc(sizeof(struct stud_node));   // 在动态内存中分配新的节点空间
        q->next = NULL;                 // 将指针成员变量初始化为 NULL,表示当前节点是末尾节点
        scanf("%d ",&q->num);           // 读取下一个学号,继续进行链表的创建
    }
}

struct stack_node 構造体を定義します。これは、生徒番号、名前、スコア、および次のノードへのポインターを格納するために使用されます。

リンク リストの先頭ポインタと末尾ポインタを定義します: struct stack_node *head, *tail。

main() 関数では、input() 関数を呼び出してリンク リストが作成され、そのリンク リストが for ループを介して走査され、各ノードのデータが出力されます。

  1. 関数 void input() では、新しいノードを操作し、動的メモリに新しいノード空間を割り当てるために、最初に一時ポインタ変数 q が作成されます。

  2. scanf()関数を使用して、生徒番号、名前、得点などの情報をキーボードから読み取り、新しく作成したノードに保存します。

  3. カウンタ len の値により、新規ノードを連結リストに挿入する際に先頭挿入方式を使用するか末尾挿入方式を使用するかが判断されます。現在の新しいノードが最初のノードの場合は、先頭ポインタと末尾ポインタでそのノードを直接指します。それ以外の場合は、末尾挿入メソッドを使用して、リンク リストの最後に新しいノードを挿入します。

  4. 読み取った学籍番号が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;                // 定义临时指针变量 p
    
    head = tail = NULL;                 // 头指针和尾指针初始值均为 NULL
    input();                            // 调用 input() 函数创建链表
    for ( p = head; p != NULL; p = p->next )   // 循环遍历链表并输出每个节点的数据
        printf("%d %s %d\n", p->num, p->name, p->score);

    return 0;
}

void input()
{
    
    
    struct stud_node *q;                // 定义临时指针变量 q,用于操作新的节点
    int len=0;                          // 定义链表中节点数(即长度)的计数器,初始值为 0

    q = (struct stud_node*)malloc(sizeof(struct stud_node));    // 在动态内存中分配新的节点空间
    q->next = NULL;                     // 将指针成员变量初始化为 NULL,表示当前节点是末尾节点
    scanf("%d ",&q->num);               // 从键盘上读入学号
    while ( q->num != 0 )               // 如果输入的学号不为 0,说明还有待创建的新节点
    {
    
    
        len++;                          // 计数器加 1,表示又成功创建了一个新节点
        scanf("%s %d",q->name,&q->score);   // 从键盘上读入姓名和分数,并存储到链表节点中

        // 根据链表节点数 len 来判定是头插法还是尾插法
        if ( len == 1 )                 // 如果当前是第一个节点,直接将头指针和尾指针都指向该节点
        {
    
    
            head = q;
            tail = q;
            tail->next = NULL;          // 将尾指针的 next 成员变量初始化为 NULL,表示当前节点是末尾节点
        }
        else                            // 否则,使用尾插法将新节点插入到链表末尾
        {
    
    
            tail->next = q;             // 将尾指针指向的节点的 next 成员变量指向 q,即当前新节点
            tail = q;                   // 尾指针更新为当前节点
            tail->next = NULL;          // 将尾指针的 next 成员变量初始化为 NULL,表示当前节点是末尾节点
        }

        q = (struct stud_node*)malloc(sizeof(struct stud_node));   // 在动态内存中分配新的节点空间
        q->next = NULL;                 // 将指针成员变量初始化为 NULL,表示当前节点是末尾节点
        scanf("%d ",&q->num);           // 读取下一个学号,继续进行链表的创建
    }
}

関数input()内の変数を使用してlen、現在のリンク リスト内の既存のノードの数を記録し、headおよび注意してくださいtail現在のノードが最初のノード (つまりlen == 1) の場合、 とheadの両方がtailそのノードを指します。そうでない場合は、末尾挿入を使用してリンク リストの末尾に新しいノードを直接追加します。同時に、ループ内の動的メモリに新しいノード空間を割り当て、q = (struct stud_node*)malloc(sizeof(struct stud_node))ステートメント。

要約する

链表的创建この質問では、 、遍历、およびその他の操作を含む、ポインターとリンク リストの関連知識ポイントを調べます插入
私はです、また会いましょう。

おすすめ

転載: blog.csdn.net/2301_77485708/article/details/131220250