개발자 데뷔!

[C/C++ 7.3] 구조체 포인터 & Linked List 본문

프로그래밍 언어/C

[C/C++ 7.3] 구조체 포인터 & Linked List

물꼮이 2022. 4. 21. 23:39

구조체로 포인터 사용 시 *(p.a) 또는 *p.a 안됨 !!! p->a 로 바꾸어 사용 !!!!

[일반] 구조체 멤버에 접근

struct.a

[포인터] 구조체 멤버에 접근

struct->a

 

 

 

 

 

 

EX)

// 2번
// 구조체 + 포인터 문제 !!!!  
int main() {					
	struct robot {
		int a, b;
		string t;			
    };
    
    // 포인터로 구조체를 가리킴
	robot robert;
	robot* p;
	p = &robert;					
    
	cin >> robert.a >> robert.b >> robert.t;
	cout << p->a + p->b <<" "<< p->t;		// 구조체로 포인터 사용 시 *(p.a) 또는 *p.a 안됨 !!! p->a 로 바꾸어 사용 !!!!
	return 0;
}

 


Linked List 

구조체 포인터를 활용해 linked list 를 만들 수 있다. 

(struct는 같은 struct를 가리킬 때 포인터 안붙이고는 사용 못함)

 

EX) 

//3번

// Linked List 만들기 !!!!!  
int main() {					
	struct NODE {
		int x;
		NODE* next;		// 구조체 내부에, 구조체를 가리키는 포인터 한번 더 사용 !!
	};
	NODE a, b, c;
											
	// a.x = 3
	a.x = 3;

	// b.x = 5
	a.next = &b;					// 포인터가 가리키는 것은 주소값 !! 
	a.next->x = 5;		// b.x = 5		// 포인터 로 struct의 member에 접근할 때는 화살표 -> 사용 !!

	// c.x = 4
	a.next->next = &c;	// b.next = &c;
	a.next->next->x = 4;	// b.next->x = 4;

	return 0;
}

 

EX) 

// 4번
int main() {
	struct NODE {
		int age;					
        NODE * next1;				
        NODE * next2;
	};
	
    NODE simson, woman1, woman2, man1, man2, man3;		
    NODE* head;

	// head는 simson을 가리킴
	head = &simson;

	// simson의 구성
	head->age = 20;				//simson.age = 20;			
	head->next1 = &woman1;			//simson.next1 = &woman1;
	head->next2 = &woman2;			//simson.next2 = &woman2;

	// woman1의 구성
	head->next1->age = 29;			//woman1.age = 29;
	head->next1->next1 = &man1;		//woman1.next1 = &man1;
	head->next1->next2 = &man2;		//woman1.next2 = &man2;

	// woman2의 구성
	head->next2->age = 30;			//woman2.age = 30;
	head->next2->next1 = &woman1;		//woman2.next1 = &woman1;
	head->next2->next2 = &man3;		//woman2.next2 = &man3;

	// man1의 구성
	head->next1->next1->age = 25;	//man1.age = 25;

	// man2의 구성
	head->next1->next2->age = 40;	//man2.age = 40;

	// man3의 구성
	head->next2->next2->age = 38;	//man3.age = 38;


	return 0;
}

 

 

Linked List - Head, Tail  사용 

iterater 사용 

for(p=head; p!=NULL; p=p->next)

 

 

EX) Linked List - Head, Tail  사용 

// 3번 __ 답안 코드 			// 싱글링크드 리스트 만들기 *****

// 노드 만들기
struct Node{				
	int num;
	Node* next;	// 링크 (화살표)
};
// 노드 포인터는 head, tail(last)만 만들어 놓기 !  ***
Node* head;
Node* last;

void addNode(int num){	// 노드가 하나도 없을 때,   {=> head=NULL, last=NULL 일 때}
	if (head == NULL) {				// 왜 last가 NULL 인건 안 따짐 ???
		head = new Node();			// new 기법 : 동적메모리 할당 기법으로 변수 생성 하는 것
		head->num = num;			// ** 반드시 포인터로 접근해서 삭제해야 함 !!!
		last = head;				// 꼭 헤드로 가리키기
	}
	// 노드가 한개 이상 있을 떼,
	else {
		last->next = new Node();		// 1. 우선 새 노드를 생성 한 후(last의 뒤에 연결된),
		last = last->next;			// 2. last화살표를 뒤로 옮기고
		last->num = num;			// 3. 생성된 노드에 숫자 넣어줌 (2. 가 선행되서 화살표가 가리켜야지 숫자 넣을 수 있음)
	}
}

int main(){
	int input;
	cin >> input;
	for (int i = 1; i <= 4; i++) {
		addNode(i * input);	 // 노드생성 & 연결
	}

	// single Linked list 출력
	Node* p = head;				// head, last 와 별개로, 출력을 위한 화살표 p 생성.
						// (head부터 출력할것이기 때문에 처음에 head 가리킴)
	while (p != NULL) {			// p(head)가 NULL 이면 끝남
		cout << p->num << " ";
		p = p->next;
	}
	return 0;
}

 

 

 

new 기법 : 동적메모리 할당 기법으로 변수 생성 하는 것

'프로그래밍 언어 > C' 카테고리의 다른 글

[C/C++ 7.4] 더블 포인터  (0) 2022.03.16
[C/C++ 3.3.5] 배열 초기화의 특이 case  (0) 2022.03.16
[C/C++ 7.3] 포인터  (0) 2022.03.16
[C/C++ 7.2] 구조체  (0) 2022.03.16
[C/C++ 7.1] 함수  (0) 2022.03.16