「データ構造」リンク・リスト


🌟 ダイナミックデータ構造



静的データ構造バー🧍‍♂️

  • 十分なメモリの割り当て->メモリの浪費
  • ダイナミックデータ構造バー🏃‍♂️


  • プログラミング実行中にメモリが大きくなるか小さくなる

  • 必要に応じて割り当てて返す
  • 連続したスペースに保存する必要がない->ポインタでデータを接続する


    🌟 ダイナミックメモリ割り当て


  • stdlib.hヘッダファイルの使用

  • ポインタ=malloc(サイズ)

  • メモリアドレスが正常に返され、NULLが失敗しました
  • 使用方法📚

    // 함수를 활용해 node 동적으로 생성하기
    #include<stdio.h>
    #include<stdlib.h>	// 동적메모리 할당을 위한 헤더파일
    typedef int ELEMENT;
    typedef struct node{
        ELEMENT data;
        struct node *next;	// 주소를 저장
    }NODE;	// NODE라는 구조체 생성
    NODE *createNode( ELEMENT data );
    void printAll( NODE *ptr );
    int main(){
        NODE *head;
        head = createNode( 10 );
        printAll( head );      
    }
    NODE *createNode( ELEMENT data ){
        NODE *new = (NODE *)malloc( sizeof(NODE) );
        new->data = data;
        new->next = NULL;
    	  return new;
    }
    void printAll( NODE *ptr ){
        while( ptr ){	// NULL을 만날 때까지
            printf("%d\n", ptr->data);
            ptr = ptr->next;
        }
    }

    🌟 リンクリスト


    リスト内のコンセプトバー🤷‍♂️


    データ構造の順序付け

    単純接続リストは🤷‍♂️


    データとポインタを接続するノード
    1つのノード上のポインタに次のノードのアドレスがある

    使用方法📚

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct listNode{
       char data[4];
       struct listNode *link;
    }listNode;
    
    typedef struct {
       listNode * head;
    }linkedList_h;
    
    // 공백 연결 리스트를 생성
    linkedList_h *createLinkedList_h();
    // 연결 리스트의 전체 메모리를 해제하는 연산
    void freeLinkedList_h(linkedList_h* L);
    // 연결 리스트를 순서대로 출력하는 연산
    void printList(linkedList_h *L);
    // 첫번째 노드로 삽입하는 연산
    void insertFirstNode(linkedList_h *L, char *x);
    // 노드를 pre 뒤에 삽입하는 연산
    void insertMiddleNode( linkedList_h *L, listNode *pre, char *x);
    // 마지막에 노드를 삽입하는 연산
    void insertLastNode( linkedList_h *L, char *x);
    // 리스트에서 x 노드를 탐색하기( page173, 175 )
    linkedList_h *searchNode(linkedList_h *L, char *x);
    int main(){
       linkedList_h * L;
       listNode * p;
    
       printf("(1) 공백리스트 생성하기! \n");
       L = createLinkedList_h();
       printList( L );
       
       printf("(2) 리스트 처음에 [수]노드 삽입하기! \n");
       insertFirstNode( L, "수");
       printList( L );
       
       printf("(3) 리스트 마지막에 [금]노드 삽입하기! \n");
       insertLastNode( L, "금");
       printList( L );
       
       printf("(4) 리스트 첫 번째에 [월]노드 삽입하기! \n");
       insertFirstNode( L, "월");
       printList( L );
       
       printf("(5) 리스트에서 [수] 노드를 찾아 그 뒤에 [목] 삽입하기! \n");
       p = searchNode( L, "수");
       if( p == NULL ) printf("찾는 데이터가 없습니다.\n");
       else    insertMiddleNode( L, p, "목");
       printList( L );
       
       printf("(6) 리스트 공간을 해제하여 공백 리스트로 만들기! \n");
       freeLinkedList_h(L);
       printList( L );
       return 0;
    }
    // 공백 연결 리스트를 생성
    linkedList_h *createLinkedList_h(){
       linkedList_h* L;
       L = (linkedList_h*)malloc(sizeof(linkedList_h));
       L -> head = NULL;	// head 생성
       return L;
    }
    
    // 연결 리스트의 전체 메모리를 해제하는 연산
    void freeLinkedList_h(linkedList_h* L){
       listNode* p;
       while (L -> head != NULL) {
          p = L -> head;
          L -> head = L -> head -> link;
          free(p);
          p = NULL;
       }
    }
    
    // 연결 리스트를 순서대로 출력하는 연산
    void printList(linkedList_h *L){
       listNode* p;
       printf ("L = (");
       p = L -> head;
       while (p != NULL) {	// 끝까지
          printf ("%s", p -> data);
          p = p -> link;
          if (p != NULL) printf (", ");
       }
       printf (") \n");
    }
    
    // 첫번째 노드로 삽입하는 연산
    void insertFirstNode(linkedList_h *L, char *x){
       listNode* newnode;
       newnode = (listNode*)malloc(sizeof(listNode));
       strcpy(newnode -> data, x);	// x를 newnode의 data로 복사
       newnode -> link = L -> head;
       L -> head = newnode;
    }
    
    // 노드를 pre 뒤에 삽입하는 연산
    void insertMiddleNode( linkedList_h *L, listNode *pre, char *x){
       listNode* newNode;
       newNode = (listNode*)malloc(sizeof(listNode));
       strcpy(newNode -> data, x);
       if (L->head == NULL) {
          newNode -> link = NULL;
          L -> head = newNode;
       }
       else if (pre == NULL) {
          L -> head = newNode;
       }
       else {
          newNode -> link = pre -> link;
          pre -> link = newNode;
       }
    }
    void insertLastNode( linkedList_h *L, char *x){
       listNode* newNode;
       listNode* temp;
       newNode = (listNode*)malloc(sizeof(listNode));
       strcpy(newNode -> data, x);
       if (L -> head == NULL) {
          L -> head = newNode;
          return;
       }
       
       temp = L -> head;
       while (temp -> link != NULL) temp = temp -> link;
       temp -> link = newNode;
    }   
    
    linkedList_h *searchNode(linkedList_h *L, char *x){
       listNode *temp;
       temp = L -> head;
       while (temp != NULL) {
          if (strcmp(temp -> data, x) == 0) return temp;
          else temp = temp -> link;
       }
       return temp;
    }
    私はあなたの時間を無駄にしません.
    I'll write something that won't waste your time.