|
AC205 7500 170 |
2) 연결리스트를 선언하기
예; 부품명(pname), 단가(uprice), 보유수(qty)를 저장할 구조체는 다음과 같다;
pname | uprice | qty |
위의 구조에 다음 노드와의 연결을 위한 링크 필드(next)가 필요하다.
pname | uprice | qty | next |
(링크 필드는 다음 노드의 주소를 저장한다. 그 주소로 가면 다음 노드를 발견한다)
연결리스트를 구현하는 실제의 C코드는 다음과 같다;
struct partSt { // 부품 데이터의 구조체 |
설명;
◎ 구조체의 선언은 'struct'라는 시스템 전용의 예약어로 시작한다.
'struct' 다음에 구조체의 명칭이 따라온다.
(예; 'struct partSt'는 partSt라는 구조체를 선언함)
◎ 이 구조체의 명칭은 “partSt”이다.
◎ 이 구조체는 네 개의 필드로 구성되어 있다; pname, uprice, qty, next
◎ 식별자(identifier) 앞에 붙은 '*'표는 '포인터 타입(pointer type)'을 말하는데,
주소를 저장한다. 포인터임을 표시하기 위해 '*'를 붙여준다.
'*'는 'indirection operator'(간접 연산자)라 한다.
◎ 정수형 변수는 정수 데이터를 저장한다;
(예); int profit; // 'profit'이라는 변수는 정수값을 저장한다.
실수형 변수는 실수를 저장한다;
(예); float gRate; // 'gRate'라는 변수는 실수값을 저장한다.
마찬가지로, 포인터 변수는 주소를 저장한다)
◎ next는 링크 필드인데, 다음 노드를 포인팅한다.
struct partSt *next;
*next의 형식은 partSt라는 구조체(struct)를 포인팅한다.
즉, *next는 현재 노드와 연결된 다음 노드를 포인팅한다.
즉, *next는 다음 노드를 연결한다.
◎ StartP는 항상 첫째 노드를 포인팅하고, LastP는 항상 마지막 노드를 포인팅 함.
(※ 연결리스트의 관리를 쉽게 하기 위함이다. 필수요소는 아니지만 편리한 장치이다.
이 두 식별자는 변수명과 같은 방식으로 만든다)
◎ 구조체 배열에서 어느 한 필드의 값을 지칭하려면,
배열명, 인덱스, 그리고 소속을 나타내는 '.', 필드의 이름이 필요하다 (예; part[5].uprice).
그러나 포인터 변수에 의해 지정되는 필드의 값은 '->'와 같은 화살표 모양의 기호를 사용한다.
예를 들면, 시작 노드의 부품명은
StartP->pname
이다.
◎ 필드에 새로운 값을 저장/갱신할 수 있다.
예; StartP->uprice = 500;
◎ 필드의 데이터 형식이 문자열 (string, 문자들로 이루어진 데이터; 예, "SR767")이면,
문자열 값을 저장하는 명령인 'strcpy'(string copy)를 사용한다.
예; strcpy(newNode->pname, pname);
('newNode->pname = pname;'은 오류이다)
◎ 링크 필드(예; next)에는 주소만 들어간다.
따라서, 'LastP->next = 30;'은 오류이다.
예; 만약 'now'가 연결리스트의 한 노드를 가리키고 있다면,
'now'는 그 노드의 주소를 갖고 있다는 의미이다.
그렇다면, 'LastP = now;'는 now가 갖고있는 주소를 LastP에 저장한다.
LastP는 now가 가리키는 노드를 가리킨다는 뜻이다.
즉, now와 LastP는 같은 노드를 포인팅한다.
[예제] ⑴ 시작 노드의 단가에 200을 입력하는 문장을 작성하시오. (답; Start->uprice = 200; )
⑵ 새 노드를 newNode라 하자. 'newNode'를 partSt(부품 데이터 구조체)로 선언하시오.
(답; struct partSt *newNode;)
⑶ 새 노드(newNode)의 링크를 NULL로 초기화하는 문장을 작성하시오.
(답; newNode->next = NULL;)
⑷ 새 노드(newNode)가 마지막 노드가 되도록 리스트에 연결하는 문장을 작성하시오.
(답; LastP->next = newNode;)
[연습문제] 아래는 ‘고객정보’를 표현하는 구조체의 선언이다.
struct CustSt {
char custName[20]; // 이름
char custPhone[15]; // 전화
int birthYear; // 생년
int balance; // 잔액
struct CustSt *next; // CustSt 구조체 포인터
} *StartC, *LastC; // 첫 노드, 마지막 노드의 포인터
⑴ 위 ‘고객정보’ 구조체의 명칭은 무엇인가?
⑵ 위 구조체의 필드는 모두 몇 개인가?
⑶ 위 구조체의 형식에 맞는 데이터의 예를 제시하시오 (하나의 노드만)
⑷ 위의 구조체에서 다음 노드를 포인팅하는 필드의 이름은 무엇인가?
⑸ StartC 포인터의 용도는 무엇인가?
⑹ 이 구조체로 만들어진 연결리스트가 있다면,
그 리스트의 마지막 노드를 포인팅하는 포인터 변수의 이름은 무엇인가?
//