👌

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

2023/02/26に公開

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

構造体(Struct)を使ったQueue

Queueとは?

  • 一番最初に入れたデータを一番最初に取り出すもの。
  • (First In First Out)
  • データを入れると一番手前にくる
  • データを取り出すときは Queue の中にある一番古いデータ(一番下にあるデータ)からしか取り出せない
  • データを追加することを enqueue という
  • データを取り出すことを dequeue という

簡単なコードの説明

  • void* create_newnode() で新しく追加したいデータのノードを作成
  • void enqueue() データをtailに追加
  • void dequeue() データをtopから取り出す
  • print_queue() Queueの中のデータを確認

実行結果

top --> John --> tail
top --> John --> Robert --> tail
top --> Robert --> tail
top --> Robert --> James --> tail

コード

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

typedef struct NODE{
  char name[16];//16byte
  struct NODE *next;//8byte
  //合計は 16+8=32 24byte
}node;

static node *top=NULL;
static node *tail=NULL;

void* create_newnode(char *name){
  node *newnode;
  newnode=malloc(sizeof(node));//24Byte分のメモリを割り当てる
  //printf(" 割り当てられたメモリは %d Byte\n",sizeof(node));
  strcpy(newnode->name,name);
  newnode->next=NULL;
  return newnode;
}

void enqueue(char *name){
  node *newnode;
  newnode=create_newnode(name);
  if(top==NULL){
    top=newnode;
    tail=newnode;
  }else{
    tail->next=newnode;
    tail=newnode;
  }
}

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

void print_queue(){
  node *ptr;
  ptr=top;
  printf("top --> ");
  while(ptr!=NULL){
    printf("%s --> ",ptr->name);
    ptr=ptr->next;
  }
  printf("tail\n");
}

int main(void) {
  enqueue("John");
  print_queue();
  
  enqueue("Robert");
  print_queue();
  
  dequeue();
  print_queue();
  
  enqueue("James");
  print_queue();
}

Discussion