C言語のリンクリスト-学生管理システム

リンクリスト:

1)リンクリストの分類:

ヘッダー:ポインターフィールドのみ

ノード:ポインタフィールド+データフィールドポインタフィールドは次のノードのデータフィールドを指し、ポインタフィールドは次のノードの最初のアドレス、つまりptemp-> next = pnewです。

テーブルテール:ポインタフィールド+データフィールド、ポインタフィールドはNULを指します

2)リンクリストはチェーンストレージ構造であり、必ずしも空間的に連続しているとは限りません。

2つのコードセグメントを理解します。(1)ptemp = ptemp-> next //次のノード操作に進みます

                             (2)ptemp-> next = pnew; //現在のノードポインタフィールドは次のノードを指します(もちろん、前のノードアドレスも保存できます)

ノードの作成---リンクリストの作成---ノードの削除---ノードの挿入---ノードのクエリ---ノードの変更

1.構造構造

typedef struct student

{
    int ID;
    char name[10];
    float score;
    struct student *pnext 
}STD;

2.ノードを作成します

STD *Creat_node(void)
{

    STD *pnew = (STD *)malloc(sizeof(STD));
    pnew->pnext = NULL;
    
    return pnew;
}

3.リンクリストを作成します

STD *Creat_link(int num)
{
    STD *phead;
    STD *pnew,*pb;
    phead = NULL;
    
    for(int i = 0;i <= num;i++)    
    {
          pnew = Creat_node();
          if(i == 0 )
          {
            phead = pnew;
          }
          else
         {
            pb->pnext = pnew;
           
         }  
          pb = pnew;
    }
    if(phead != NULL)
    {
        pb->pnext = NULL;
    }
      return phead;

}

4.ノードを削除します

int Delete_node(STD *phead,int ID)
{
    STD *ptemp = phead;
    STD *pdelete = NULL;
    
    if(phead == NULL)
    {
       perror("要查询的链表为空");
    }
    while(ptemp->pnext != NULL)
    {
        if(ptemp->pnext->id == ID)
        {
           pdelete = ptemp->pnext;
           ptemp=>pnext = pdelete->pnext;
            free(pdelete);
            return 1;
        }
        ptemp = ptemp->pnext;
    }
        return 0;
    
}

5.ノードを挿入します

STD *Insert_node(STD *phead,STD *pnew)
{
    STD *ptemp = phead;
    
    if(ptemp == NULL)
    {
        perror("Insert 链表为空");
        exit(0);
    }
    while(ptemp->pnext != NULL)
    {
        ptemp=ptemp->pnext;
    }
    ptemp->pnext = pnew;
    
    return ptemp;

}

6.クエリノード

STD *SEEK_node(STD *phead,int id)
{
    STD *ptemp = phead;
    STD *pseek = NULL;
    while(ptemp->pnext != NULL)
    {
        if(ptemp->pnext->id == ID)
        {
            pseek = ptemp->pnext;
            return pseek;
        }
        ptemp = ptemp->pnext;
    }
    
    return 0;
}

7.ノードを変更します

int *Change_node(STD *phead,STD ptemp)
{
    STD *pseek = SEEK_node(phead,ptemp.id);
    
    pseek->id = std.id;
    strcpy(pseek->name,std.name);
    pseek->score = std.score;

    return 1;

   
}

2)一般的に使用される機能のリンクリスト

(1)malloc

         関数プロトタイプ:void * _Cdecl malloc(size_t size);

         機能機能:メモリからメモリスペースを申請します(手動で開きます。ヒープ領域から開きます。スペースを解放しない限り、保存されたデータはメインエンドが自動的にスペースを解放するまで常に存在します)

         使用:p = malloc(8); // 8バイトのスペースをメモリに適用します。成功した場合、アプリケーション後のスペースの最初のアドレスがpに保存されます。

(2)calloc

            関数プロトタイプ:void * _Cdecl calloc(size_t nitems、size_t size);

            機能機能:メモリから複数のメモリスペースに適用します

            使用法:例:p = calloc(3,4);成功:開かれた最初のスペースの最初のアドレスを返し、失敗した場合はNULLを返します

(3)realloc

       関数プロトタイプ:void * _Cdecl realloc(void * block、size_t size);

       関数function:割り当てられたメモリスペースのサイズを変更します

       関数パラメータ:ブロック:変更が必要なメモリスペースの最初のアドレスを示しますサイズ:変更するメモリスペースの量

       関数の戻り値:成功:新しいスペースの最初のアドレスを返します。失敗:NULL

       例:p = realloc(q、20); //メモリに適用してスペースのバイトサイズを変更し、20バイトに変更してから、新しいスペースの最初のアドレスをpに割り当てます。  

注:元のスペースにデータがある場合、新しいスペースが元のスペースよりも小さいと、データが失われます。

(4)無料

関数プロトタイプ:void _Cdecl free(void * block);

機能機能:メモリに動的に開かれたスペースを手動で解放します

関数パラメーター:解放されるスペースの最初のアドレス

関数の戻り値:なし

一時的な手書きの記事を書くための手順は検証されておらず、異なる場合があります!

 

おすすめ

転載: blog.csdn.net/qq_45604814/article/details/110450434