🐙

C言語 データ構造 構造体を使ったStack

2023/02/25に公開

学んだことのまとめのつもりなので間違えてるとこがありましたら、教えていただけると助かります!

構造体(Struct)を使ったStack

Stackとは?

一番最後に入れたデータを一番最初に取り出すもの。
(Last in First out)と呼ばれる

  • データを追加すると一番上にくる。
  • データを取り出すときは一番上にあるデータからしか取り出せない
  • データを追加することを Push という
  • データを取りだすことを Pop という

コードの簡単な説明

  • void *create_newnod()で追加したいノードを作る
  • void push() でStackの中にデータを追加
  • void pop() でStackからデータを取り出す
free()で確保していたメモリを解放(解放しないと、バグの原因になるかも)
  • void print_stack(node *top) でStackの中を確認

実行結果

Top --> male S_1 --> 
Top --> female S_2 --> male S_1 --> 
Top --> male S_1 --> 
Top --> female S_3 --> male S_1 --> 

コード

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

typedef enum GENDER{
  male,
  female
}Gender;

typedef struct NODE{
  int gender;//4バイト
  char Student_number[16];//16バイト
  struct NODE *next;//8バイト
//合計は 4+16+8=28 で 28バイト
}node;

void* create_newnode(Gender gender,char *student_num){
  node *newnode;
  newnode=malloc(sizeof(node));
  //メモリの確保は8で区切られる 28バイトの場合だと32バイト確保する
  //printf("割り当てられたメモリ : %ld Byte\n",sizeof(node));
  strcpy(newnode->Student_number,student_num);
  newnode->gender=gender;
  newnode->next=NULL;
  return newnode;
}

void* push(node *top,Gender gender,char *student_num){
  //printf("%s\n",student_num);
  node *newnode=create_newnode(gender,student_num);
  if(top==NULL){
    top=newnode;
  }else{
    newnode->next=top;
    top=newnode;
  }
  return top;
}

void *pop(node *top){
  if(top==NULL){
    printf("!-- Stack is Empty --!\n");
  }else{
    node *temp=top;
    top=top->next;
    free(temp);//確保していたメモリを解放
  }
  return top;
}

void print_stack(node *top){
  if(top!=NULL){
    if(top->gender==male){
      printf("%s ","male");
    }else{
      printf("%s ","female");
    }
    printf("%s --> ",top->Student_number);
    print_stack(top->next);
  }else{
    return;
  }
}

int main(void) {
  node *top;
  top=NULL;

  
  top=push(top,male,"S_1");
  
  printf("Top --> ");
  print_stack(top);
  printf("\n");
  
  top=push(top,female,"S_2");
  
  printf("Top --> ");
  print_stack(top);
  printf("\n");
  
  top=pop(top);
  
  printf("Top --> ");
  print_stack(top);
  printf("\n");
  
  top=push(top,female,"S_3");
  
  printf("Top --> ");
  print_stack(top);
  printf("\n");
  
}

Discussion