[C 언어] 구조체
- 카테고리 없음
- 2020. 12. 1.
자기참조 구조체
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;
}