비디오: C언어/C++ 강의 76화 stack [어소트락 게임아카데미] 2024
C 프로그래밍에서 이미 작성한 코드에 두 번째 구조를 추가하려면 서로 포인터를 포함하는 일련의 구조 인 연결 목록을 만듭니다. 구조의 기본 데이터와 함께 구조에는 목록의 다음 구조의 주소를 포함하는 포인터가 들어 있습니다.
포인터 이름을 영리하게 저글링하고 목록의 끝을 씌우려면 NULL을 더하면 A Primitive Linked-List Example의 소스 코드와 비슷한 것으로 끝날 수 있습니다.
기본 연결 목록 예제 #include #include #include int main () {struct 스톡 {char symbol [5]; int 수량; 부유물 가격; 구조체 주식 * 다음;}; 구조체 주식 * 처음; 구조체 주식 * 현재; struct stock * 신품; / * 메모리에 구조체 만들기 * / first = (struct stock *) malloc (sizeof (struct stock)); if (first == NULL) {puts ("어떤 종류의 malloc () 오류"); exit (1);} / * 구조 데이터 할당 * / current = first; strcpy (현재 -> 기호, "GOOG"); current-> quantity = 100; current-> price = 801. 19; current-> next = NULL; new = (struct stock *) malloc (sizeof (struct stock)); if (new == NULL) {puts ("또 다른 malloc () 오류"); exit (1);} current-> next = new; 현재 = 새로운; strcpy (현재 -> 기호, "MSFT"); current-> quantity = 100; current-> price = 28. 77 쪽; current-> next = NULL; / * 데이터베이스 표시 * / puts ("투자 포트폴리오"); printf ("SymboltSharestPricetValuen"); 현재 = 처음; printf ("% - 6st % 5dt %.2ft %.2fn", 전류 -> 기호, 전류 -> 수량, 전류 -> 가격, 전류 -> 수량 * 전류 -> 가격); current = current-> next; printf ("% - 6st % 5dt %.2ft %.2fn", 전류 -> 기호, 전류 -> 수량, 전류 -> 가격, 전류 -> 수량 * 전류 -> 가격); return (0);}
이 소스 코드는 꽤 길지만 첫 번째 구조와 연결된 두 번째 구조를 생성합니다. 소스 코드의 길이가 당신을 협박하게하지 마십시오.
링크 된 목록을 만들 때 typedef를 사용하여 새로운 구조체 변수를 정의하지 마십시오. Primitive Linked-List Example은 typedef를 사용하지 않으므로 코드에서 문제가되지 않지만 많은 C 프로그래머는 구조체와 함께 typedef를 사용합니다. 조심해!
Line 15에서 사용되는 new라는 변수 이름은 C ++의 예약어이기 때문에 이중 언어를 사용하려면 변수 이름을 new_struct 또는 new라는 단어로 변경하십시오.
첫 번째 구조체가 채워지면, 30 행은 NULL 포인터를 다음 요소에 할당합니다.해당 NULL 값은 연결된 목록의 끝을 덮습니다.32 행은 새로운 포인터 변수에 주소를 배치하여 구조체를 생성합니다. 주소는 38 행의 첫 번째 구조에 저장됩니다. 두 번째 구조의 위치가 유지되는 방법입니다.
40 ~ 43 행은 두 번째 포인터에 대한 정보를 채우고 43 행의 다음 요소에 NULL 값을 할당합니다.
연결은 구조의 내용이 표시 될 때 발생합니다. 48 행은 첫 번째 구조의 주소를 캡처합니다. 그런 다음 54 번째 줄은 첫 번째 구조에서 다음 구조의 주소를 캡처합니다.
연습 1
:
A Primitive Linked-List Example의 소스 코드를 편집기에 입력하십시오. 길기는하지만 나중에 다시 편집해야하기 때문에 입력하십시오 (지금까지 익숙하지 않은 경우). 빌드하고 실행하십시오. 배열과 달리 연결된 목록의 구조에는 번호가 매겨지지 않습니다. 대신 각 구조는 목록의 다음 구조에 연결됩니다. 첫 번째 구조체의 주소를 알고있는 한, NULL로 표시되는 끝까지 목록을 처리 할 수 있습니다. 원시 링크드리스트 예제는 반복 된 코드가 많은 엉성한 소스 코드를 보여줍니다. 코드에서 이와 같이 여러 문장을 볼 때 즉시 "기능"을 생각해야합니다. "
더 나은 연결 목록 예제
A Better Linked-List Example에 나와있는 것처럼 생성됩니다. 핵심은 세 번째 구조 변수를 사용하는 것입니다 (13 ~ 15 줄에 표시).
먼저 항상 주소를 포함합니다. 목록의 첫 번째 구조 항상.
current는 작업중인 구조의 주소, 데이터로 채워지거나 표시되는 주소를 포함합니다.
new는 malloc () 함수를 사용하여 만든 새로운 구조의 주소입니다.
-
7 행은 주식 구조를 글로벌로 선언합니다. 그렇게하면 다양한 기능에서 액세스 할 수 있습니다.
-
25 번째 라인과 39 번째 라인 사이의 for 루프는 새로운 구조체를 생성하여 함께 연결합니다.초기 구조는 특별하기 때문에 그 주소는 30 행에 저장됩니다. 그렇지 않으면 make_structure () 함수로 인해 새로운 구조가 할당됩니다.
-
35 행에서 이전 구조가 업데이트됩니다. 현재의 값은 36 행까지 변경되지 않습니다. 그 전에는 현재 구조의 포인터가 다음 구조 new의 주소로 업데이트됩니다. Line 40에서 마지막 구조의 새 포인터를 NULL로 재설정하여 링크 된 목록의 끝을 표시합니다.
46 행의 while 루프는 연결된 목록의 모든 구조를 표시합니다. 루프의 조건은 현재 포인터의 값입니다. NULL이 발생하면 루프가 중지됩니다.
더 나은 링크드리스트 예제에 나와있는 나머지 코드는 꽤 자명 한 함수로 구성되어 있습니다.
연습 2
:
더 나은 링크 된 목록 예제의 코드를 편집기에 복사합니다. 빌드하고 실행하십시오.
fill_structure () 함수에서 scanf () 문을 기록하십시오. 포인터에 대한 "peeker"표기법 인 -> 기억하십시오. 주소를 가져 오려면 scanf () 함수에서 & 변수 앞에 접두어를 붙여야합니다.