[C 언어] 구조체

    자기참조 구조체

     

    struct Data {

      //member variable...

     

      //자기자신을 참조하는 포인터선언

    };

     

     

    자기자신을 참조하게 되면, 자기자신의 구조체의 주소값을 저장 할 수 있다.

    또한 이 원리를 이용하면 똑같은 구조체를 사용하는 다른 구조체 또한 사용 할 수 있게 된다.

     

    이 방식은 링크리스트, 트리구조등 여러곳에서 사용한다.

     

     

    1. Single Linked List

    - 단방향으로 다음 것을 가르킨다.

     

    2. Single 환형 List

    - 단방향으로 다음 것을 가르키지만, 마지막은 제일 처음을 가르킨다. 이 모습이 원의 모양과 동일하다.

     

    3. Double Linked List

    - Single은 포인터 하나만 갖고 있다면, 더블은 2개를 갖고 있다.

    - 이전과 그 다음에 대한 포인터를 가지고 있다.

     

    4. Dable 환형 List

    - 이전과 그 다음에 대한 포인터를 가지고 있다. 제일 마지막은 제일 처음을 가르킨다.

     

     

    장점

    - 배열이 아니지만, 배열과 비슷하게 일괄처리 가능하게 도와준다.

     

    단점

    - 코딩이 어렵다.

     

     

    1. Data 추가

    링크 리스트

    *head (링크의 첫 번째 노드)

    => 절대 변경 되어서는 안된다.

    => 첫 번째가 변경되었을 때 사용한다.

     

    *newData(추가)

    => 새로운 노드만 데이터만 잡는 역할이다.

     

    *del(삭제)

    => 삭제 할 때 사용하는 역할

     

    *curse(온 갖 잡일, 제일 많이 사용)

    => 검색하는데 많이 사용한다.

     

     

     

    ★★★

    마지막 포인터는 구조상 다음 차례가 없기 때문에 가르킬 것이 없다.

    그러므로 Null을 줘야 한다.

     

     

     

    삭제할 때는 앞의 것을 끊어버려라.

     

     

     

    마지막 값 넣기

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    struct  Data
    {
    	int data;
    	struct Data* next;
    };
    
    int main()
    {
    	struct Data* head, * cur, * newData, * del;
    
    	int i;
    
    	head = newData = cur = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 1;
    	newData-> next = NULL;
    
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 2;
    	newData->next = NULL;
    
    	//연결
    	cur->next = newData;	//1->2.
    
    	//새노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 3;
    	newData->next = NULL;
    
    	cur->next->next = newData;	//1->2->3
    
    
    	cur = head;
    	for (i = 0; cur != NULL; i++)
    	{
    		printf("%d\n", *cur);	//cur->data
    		cur = cur->next;
    	}
    
    	return 0;
    }

     

     

    중간에 값 넣기

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    struct  Data
    {
    	int data;
    	struct Data* next;
    };
    
    int main()
    {
    	struct Data* head, * cur, * newData, * del;
    	int pos = -1;
    
    	int i;
    
    	head = newData = cur = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 1;
    	newData-> next = NULL;
    
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 2;
    	newData->next = NULL;
    
    	//연결
    	cur->next = newData;	//1->2.
    
    	//새노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 3;
    	newData->next = NULL;
    
    	cur->next->next = newData;	//1->2->3
    
    	//출력하기
    	cur = head;
    	while(cur != NULL)
    	{
    		printf("%d\n", cur->data);	//cur->data
    		cur = cur->next;
    	}
    
    
    	//새 노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 4;
    	newData->next = NULL;
    
    
    	printf("몇 번째 넣고 싶어?\n");
    	scanf("%d", &pos);
    	printf("========================\n");
    	//중간 삽입
    	//1. pos 수만큼 이동해라.
    	cur = head;
    	for (i = 0; i < pos - 2; i++)
    	{
    		cur = cur->next;
    	}
    
    	// 2.중간 연결하기
    	newData->next = cur->next;
    
    	// 3. 앞부분연결
    	cur->next = newData;
    
    
    	//출력하기
    	cur = head;
    	while (cur != NULL)
    	{
    		printf("%d\n", cur->data);	//cur->data
    		cur = cur->next;
    	}
    
    
    	return 0;
    }

     

    처음시작 값에 넣기

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    struct  Data
    {
    	int data;
    	struct Data* next;
    };
    
    int main()
    {
    	struct Data* head, * cur, * newData, * del;
    	int pos = -1;
    
    	int i;
    
    	head = newData = cur = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 1;
    	newData-> next = NULL;
    
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 2;
    	newData->next = NULL;
    
    	//연결
    	cur->next = newData;	//1->2.
    
    	//새노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 3;
    	newData->next = NULL;
    
    	cur->next->next = newData;	//1->2->3
    
    
    
    	//새 노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 4;
    	newData->next = NULL;
    
    	cur->next->next->next = newData;
    
    
    
    	//맨 처음에 값을 넣기
    	//새 노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 5;
    	newData->next = NULL;
    
    	newData->next = head;
    	head = newData;
    
    	//출력하기
    	cur = head;
    	while (cur != NULL)
    	{
    		printf("%d\n", cur->data);	//cur->data
    		cur = cur->next;
    	}
    
    
    	return 0;
    }

     

     

    삭제

     

    첫번째 위치 삭제

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    struct  Data
    {
    	int data;
    	struct Data* next;
    };
    
    int main()
    {
    	struct Data* head, * cur, * newData, * del;
    	int pos = -1;
    
    	int i;
    
    	head = newData = cur = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 1;
    	newData-> next = NULL;
    
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 2;
    	newData->next = NULL;
    
    	//연결
    	cur->next = newData;	//1->2.
    
    	//새노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 3;
    	newData->next = NULL;
    
    	cur->next->next = newData;	//1->2->3
    
    
    
    	//새 노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 4;
    	newData->next = NULL;
    
    	cur->next->next->next = newData;
    
    
    
    	//맨 처음에 값을 넣기
    	//새 노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 5;
    	newData->next = NULL;
    
    	newData->next = head;
    	head = newData;
    
    	//출력하기
    	cur = head;
    	while (cur != NULL)
    	{
    		printf("%d\t", cur->data);	//cur->data
    		cur = cur->next;
    	}
    
    	printf("\n========삭제후========\n");
    
    
    	//삭제
    
    	//head 삭제
    	del = head;
    	head = head->next;
    
    	//링크 끊기
    	del->next = NULL;
    
    	free(del);
    
    	//출력하기
    	cur = head;
    	while (cur != NULL)
    	{
    		printf("%d\t", cur->data);	//cur->data
    		cur = cur->next;
    	}
    
    
    	return 0;
    }

     

    중간 값 삭제하기

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    struct  Data
    {
    	int data;
    	struct Data* next;
    };
    
    int main()
    {
    	struct Data* head, * cur, * newData, * del;
    	int pos = -1;
    
    	int i;
    
    	head = newData = cur = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 1;
    	newData-> next = NULL;
    
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 2;
    	newData->next = NULL;
    
    	//연결
    	cur->next = newData;	//1->2.
    
    	//새노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 3;
    	newData->next = NULL;
    
    	cur->next->next = newData;	//1->2->3
    
    
    
    	//새 노드 생성
    	newData = (struct Data*)calloc(1, sizeof(struct  Data));
    	newData->data = 4;
    	newData->next = NULL;
    
    	cur->next->next->next = newData;
    
    
    	//출력하기
    	cur = head;
    	while (cur != NULL)
    	{
    		printf("%d\t", cur->data);	//cur->data
    		cur = cur->next;
    	}
    
    	printf("\n========삭제후========\n");
    
    
    	//삭제
    
    	//원하는 위치 삭제
    	printf("몇 번째 삭제하고 싶어?\n");
    	scanf("%d", &pos);
    
    	// 중간삽입
    	// 1. 삽입전 cur 검색
    	cur = head;
    	for (i = 0; i < pos - 2; i++)
    	{
    		cur = cur->next;
    	}
    
    	// del 연결
    	del = cur->next;
    
    	// 앞노드와 뒷노드 연결
    	cur->next = del->next;
    
    	// 삭제의 연결값 삭제
    	del->next = NULL;
    	
    	//완전 삭제
    	free(del);
    
    	//출력하기
    	cur = head;
    	while (cur != NULL)
    	{
    		printf("%d\t", cur->data);	//cur->data
    		cur = cur->next;
    	}
    
    
    	return 0;
    }

    반응형

    댓글

    Designed by JB FACTORY