首頁 > 軟體

C語言巢狀連結串列實現學生成績管理系統

2022-07-25 18:03:35

C語言巢狀連結串列實現學生成績管理系統,供大家參考,具體內容如下

連結串列A,每個節點存放一個新的連結串列B1,B2,B3,B4,B5的頭結點。 場景: 一個年級,相當連結串列A 該年級5個班,每個班5個人,相當於連結串列B1--B5 做一個學生成績管理系統 學生成績有語文 數學 英語 功能: 錄入成績 找三科總分的最高分 最低分 算出平均分

前言

連結串列是一種常見的基礎資料結構,結構體指標在這裡得到了充分的利用。

連結串列可以動態的進行儲存分配,也就是說,連結串列是一個功能極為強大的陣列,他可以在節點中定義多種資料型別,還可以根據需要隨意增添,刪除,插入節點。

連結串列都有一個頭指標,一般以head來表示,存放的是一個地址。連結串列中的節點分為兩類,頭結點和一般節點,頭結點是沒有資料域的。連結串列中每個節點都分為兩部分,一個資料域,一個是指標域。

說到這裡你應該就明白了,連結串列就如同車鏈子一樣,head指向第一個元素:第一個元素又指向第二個元素;……,直到最後一個元素,該元素不再指向其它元素,它稱為“表尾”,它的地址部分放一個“NULL”(表示“空地址”),連結串列到此結束。

作為有強大功能的連結串列,對他的操作當然有許多,比如:連結串列的建立,修改,刪除,插入,輸出,排序,反序,清空連結串列的元素,求連結串列的長度等等。
C語言巢狀連結串列實現學生成績管理系統:熟悉連結串列的建立,結構體指標的使用。

實現思路:建立學生連結串列->建立班級連結串列
其中
學生連結串列的結點的資料域存放學生的資訊;
班級連結串列的結點的資料域為指向學生連結串列頭結點的指標;
利用這樣的巢狀連結串列實現多個班級,以及每個班級多個學生的成績管理。

提示:以下是本篇文章正文內容,下面案例可供參考

一、程式碼實現

1.包含標頭檔案

程式碼如下(範例):

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

2.定義學生連結串列的結點

程式碼如下(範例):

struct Student //宣告學生連結串列的節點
{
        int chinese;
        int math;
        int english;
        int sum;
        struct Student* next;
};

3.定義班級連結串列的結點

程式碼如下(範例):

struct Class//宣告班級連結串列的節點
{
        struct Student* student;
        struct Class* next;
};

4.建立一個新的學生連結串列的結點並且通過尾插法插入連結串列中

程式碼如下(範例):

struct Student* CreateStudentNode(struct Student*head,int num)//生成一個新的學生節點並且利用尾插法插入連結串列中
{
        struct Student* p=NULL;
        struct Student* node=(struct Student*)malloc(sizeof(struct Student));//為新節點開闢空間
        //初始化新節點
        node->next=NULL;
        printf("輸入第%d個學生的資訊:(語文 數學 英語)n",num+1);
        scanf("%d %d %d",&node->chinese,&node->math,&node->english);
        node->sum=node->chinese+node->math+node->english;

        if(head->next==NULL){                                     //連結串列只有一個節點時
                head->next=node;
                return head;
        }
        else{                                                     //連結串列有多個節點時  將指標p移到連結串列尾  
                p=head;
                while(p->next!=NULL){    p=p->next;  }      //將指標p移到連結串列尾     
        }

        p->next=node;
        return head;
}

5.生成學生連結串列

程式碼如下(範例):

struct Student* init_StudentLink()//生成學生連結串列
{
        int sum,i;
        struct Student* head=(struct Student*)malloc(sizeof(struct Student));//生成頭節點
        struct Student* p=NULL;
        scanf("%d",&sum);//學生數
        for(i=0;i<sum;i++){

                p=CreateStudentNode(head,i);

        }

        return p;
}

6.建立一個新的班級連結串列的結點並且通過尾插法插入連結串列中

程式碼如下(範例):

struct Class* CreateClassNode(struct Class* head,int num)//生成一個新的班級節點並且利用尾插法插入連結串列中
{
        struct Class* p=NULL;
        struct Class* node=(struct Class*)malloc(sizeof(struct Class));
        node->next=NULL;
        struct Student* q=NULL;

        printf("輸入第%d班級的人數:n",num+1);
        q=init_StudentLink();
        node->student=q;

        if(head->next==NULL){
                head->next=node;
        }
        else{
                p=head;
                while(p->next!=NULL){ p=p->next; }

        }

        return 0;

}

7.生成班級連結串列

程式碼如下(範例):

void init_Class(struct Class* head)//生成班級連結串列
{
        int sum,i;
        printf("請輸入建立的班級數n");
        scanf("%d",&sum);
        for(i=0;i<sum;i++){
                CreateClassNode(head,i);
        }

}

8.列印結點資訊

程式碼如下(範例):

void printf_node(struct Class *head)//列印節點資訊
{
        int max,min;
        struct Class *q=NULL;
        struct Student *p=NULL;
        q=head->next;
        min=max=q->student->next->sum;
        printf("*****************************************************************************************************n");
        printf("成績統計t(語文t數學t英語t總分t平均分)n");
        printf("*****************************************************************************************************n");

        int i=0,j=0;
        p=q->student->next;
        while(q){
                i++;
                for(p;p->next!=NULL;p=p->next){
                        j++;
                        printf("第%d班第%d學生的成績n",i,j);
                        printf("語文:%d 數學:%d  英語:%d 總分:%d 平均分:%lfn",p->chinese,p->math,p->english,p->sum,(double)(p->sum)/3);
                        if(p->sum>max){
                                max=p->sum;
                        }
                        if(p->sum<min){
                                min=p->sum;
                        }

                }
                printf("n");
                q=q->next;
                j=0;
        }

        printf("總分最高為:%dn",max);
        printf("總分最低為:%dn",min);
}

9,主函數

程式碼如下(範例):

int main()
{

        struct Class* head=(struct Class*)malloc(sizeof(struct Class));
        head->next=NULL;//生成班級頭結點
        init_Class(head);//生成班級連結串列
        printf_node(head);//列印資訊

        return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com