이 접근 방식은 실패할 운명이며 일반적으로 처음부터 다시 작성해야 합니다.
따라서 이 시나리오를 해결하기 위해 문제를 여러 하위 문제로 나눈 다음 하나씩 해결하려고 시도할 수 있습니다. 하나.
이렇게 하면 작업이 더 쉬워질 뿐만 아니라 높은 수준에서 지금 가장 큰 문제는 이론적으로가 아니라 소프트웨어 를 "파괴"하는 방법입니다. 우리는 C/C++, Python 및 Java. 설명을 위해 하나의 프로그램에 모든 기본 연결 목록 삽입 이 있다고 가정해 보겠습니다. 메서드(함수)가 많기 때문에 필요한 기본 기능 위에 모든 메서드 정의를 작성하여 프로그램을 복잡하게 만들 수 없습니다. 하지만 그렇게 했다고 해도 메서드를 정렬하는 문제, 한 메서드가 다른 메서드보다 먼저 있어야 하는 등의 문제가 있을 수 있습니다. 그래서 이 문제를 해결하기 위해 모든 프로토타입을 시작 부분에 선언할 수 있습니다. 프로그램, 그리고 그 아래에서 특정 순서로 정의할 수 있는 기본 메서드: 프로그램: C/C++로 이동
< a href = # Python> Python으로 이동
Java로 이동
C / C++
// 완전한 연결 목록 삽입
# include "stdio.h >
# 포함 "stdlib.h >
// ------------ -------------- ------
// 공지사항 - 시작:
// ------ --------------------------
구조체
노드;
struct
노드 * create_node(
int
<코드 클래스 = "일반"> 데이터);
무효
b_insert (
구조체
노드 ** 헤드,
int
데이터);
무효
n_insert (
구조체
노드 ** 헤드,
int
데이터,
int
pos);
무효
e_insert (
구조체
노드 ** 헤드,
int
데이터);
무효
디스플레이 (
구조체 < /코드> <코드 클래스 = "일반"> 노드 * 임시);
// ------------ -------------- ------
// 공지사항 - END:
// ------ --------------------------
정수
<코드 클래스 = "일반"> 메인 ()
<코드 클래스 = "일반"> {
<코드 클래스 = "키워드 굵게" > struct 노드 * 헤드 = NULL;
int
채널, 데이터, 위치;
printf
(
" 연결 목록: "
);
동안
(1) {
printf
(
"1. 처음에 삽입"
);
printf
(
"2.삽입 N번째 위치에서"
);
printf
(
"3.삽입 종료 시"
);
printf
(
"4.디스플레이 "
<코드 클래스 = "일반">);
printf
(
"0.Exit "
<코드 클래스 = "일반">);
printf
(
"선택 사항을 입력하십시오 :"
<코드 클래스 = "일반">);
scanf
(
"% d"
<코드 클래스 = "일반">, & 채널);
스위치
(ch) {
케이스
1:
printf
(
" 데이터:"
<코드 클래스 = "일반">);
scanf
(
"% d"
, & 데이터);
b_insert (& 헤드, 데이터);
나누기
;
케이스
2:
printf
(
" 데이터:"
<코드 클래스 = "일반">);
scanf
(
"% d"
, & 데이터);
printf
(
" 위치 입력: "
);
scanf
(
"% d"
, & amp; pos);
n_insert (& 헤드, 데이터, 위치);
나누기
;
케이스
3:
printf
(
" 데이터:"
<코드 클래스 = "일반">);
scanf
(
"% d"
, & 데이터);
e_insert (& 헤드, 데이터);
나누기
;
케이스
4:
< 코드 클래스 ="정의되지 않은 공백 "> <코드 클래스 ="일반 "> 디스플레이(머리);
나누기
;
케이스
0:
반환
0;
기본값
:
printf
(
"잘못된 선택"
<코드 클래스 = "일반">);
<코드 클래스 = "일반">}
<코드 클래스 ="일반 ">}
<코드 클래스 ="일반 ">}
<코드 클래스 = "주석"> // ---------------- ---------- ------ // 정의 - 시작:
// ---- ----------------------------
구조체
노드 {
int
< 코드 클래스 ="일반 "> 데이터;
struct
노드 * 다음;
<코드 클래스 = "일반">};
struct
노드 * create_node (
int
데이터)
{
< 코드 클래스 = "키워드 굵게"> 구조체 <코드 클래스 = "일반" > 노드 * 임시
<코드 클래스 = "일반"> = ( < 코드 클래스 = "키워드 볼드" > 구조체 <코드 클래스 = "일반"> 노드 *)
malloc
< 코드 클래스 = "일반"> ( <코드 클래스 = "키워드 볼드"> sizeof <코드 클래스 = "일반"> ( <코드 클래스 = " 키워드 볼드 "> 구조체 < /코드> <코드 클래스 ="일반 "> 노드));
temp- > 데이터 = 데이터;
temp- > 다음 = NULL;
반환
임시;
}
무효
<코드 class = "plain"> b_insert ( struct
노드 ** 헤드,
int
<코드 클래스 = "일반"> 데이터)
<코드 클래스 = " 일반 "> {
<코드 class ="undefined spaces "> 구조체
노드 * new_node = create_node(데이터);
new_node- > 다음 = * 머리;
* 헤드 = new_node;
}
무효
<코드 class = "plain"> n_insert ( struct
노드 ** 헤드,
int
데이터,
int
위치)
{
if
(* 헤드 == NULL) {
b_insert (헤드, 데이터);
반환
;
}
<코드 클래스 ="키워드 굵게 "> 구조체 노드 * new_node = create_node(데이터);
struct
노드 * 임시 = * 머리;
(
int
i = 0; i "pos - 2; ++ i)
임시 = 온도-> 다음;
new_node- > 다음 = 온도- > 다음;
temp- > 다음 = new_node;
}
무효
<코드 class = "plain"> e_insert ( struct
노드 ** 헤드,
int
<코드 클래스 = "일반"> 데이터)
<코드 클래스 = " 일반 "> {
<코드 class ="undefined space "> if
(* head == NULL) {
b_insert (헤드, 데이터);
반환
;
}
<코드 클래스 ="키워드 굵게 "> 구조체 <코드 클래스 ="일반 "> 노드 * 임시 = * 머리;
while
(temp- > next! = NULL)
temp = temp- > 다음;
struct
노드 * new_node = create_node(데이터);
temp- > 다음 = new_node;
}
무효
<코드 class = "plain"> 디스플레이 ( 구조체
노드 * 임시)
< 코드 클래스 = "일반"> {
<코드 클래스 = "함수 볼드"> printf <코드 클래스 = "일반"> ( <코드 클래스 = "string"> "요소는 다음과 같습니다." );
while
(temp! = NULL) {
printf
(
"% d"
, 온도-> 데이터);
temp = temp- > 다음;
}
printf
<코드 클래스 =" 일반 "> ( <코드 클래스 ="문자열 ">" " <코드 클래스 = "일반">);
}
// ------ --------------------------
// 정의 - END
<코드 클래스 = "주석"> // --------------------- -----------
코드 컴파일: 우리는 위의 프로그램을 컴파일할 수 있습니다:
gcc linkedlist.c -o linkedlist
그리고 그것은 작동합니다!
위 코드의 주요 문제:
우리는 이미 프로그램의 주요 문제점을 알 수 있지만 개별적으로 또는 그룹으로 코드로 작업하는 것이 그리 쉽지만은 않습니다.
위의 작업을 원하는 사람이 있다면 프로그램, 그 다음 그 사람이 직면하고 있는 많은 문제 중 일부:
- 전체 소스 파일을 통과해야 합니다. 일부 기능을 개선하거나 개선합니다.
- 쉽게 재사용할 수 없음 프로그램을 다른 프로젝트의 기초로 사용합니다.
- 코드가 매우 복잡하고 전혀 매력적이지 않아 코드를 탐색하기가 매우 어렵습니다.
그룹 프로젝트나 대규모 프로그램의 경우 위의 접근 방식은 전체 비용, 에너지 및 실패율을 증가시키는 것을 보장합니다.
올바른 접근 방식:
이 행은 "#include"로 시작하는 모든 C/C++ 프로그램에서 시작됩니다.
이는 다음을 의미합니다. "library" 헤더 (.h 파일) 에 선언되고 library.c / cpp 파일에 정의된 모든 기능을 포함합니다.
이 라인은 컴파일 시 사전 처리됩니다.
우리는 우리 자신의 목적을 위해 수동으로 이러한 라이브러리를 만들려고 시도할 수 있습니다.
기억해야 할 중요 사항 :
- ".h" 파일에는 프로토타입 선언(예: 함수, 구조) 및 전역 변수만 포함됩니다.
- ".c / .cpp" 파일에는 실제 구현(헤더 파일의 선언 정의)이 포함되어 있습니다.
- 모든 소스 파일을 컴파일할 때 동일한 함수의 여러 정의가 변수 등이 동일한 프로젝트에 존재하지 않습니다. (매우 중요)
- 정적 함수 를 사용하여 해당 함수가 선언된 파일로 제한합니다.
- 외부 파일에서 참조하는 변수를 사용하려면 extern 키워드를 사용하십시오.
- C++를 사용할 때 네임스페이스에 주의하고 충돌을 피하기 위해 항상 namespace_name:: function(), 을 사용하십시오. ol >
프로그램을 더 작은 코드로 분할:
위의 프로그램을 조사한 후 이 큰 프로그램을 적절한 작은 부분으로 분할하고 그러면 쉽게 처리됩니다.
위의 프로그램은 기본적으로 두 가지 주요 기능을 가지고 있습니다.
1) 노드에 데이터를 생성, 삽입 및 저장합니다.
2) 노드 표시
이렇게 하면 프로그램을 적절하게 분할하여 다음과 같이 할 수 있습니다.
1) 기본 파일은 > 프로그램 드라이버, 삽입 모듈의 Nice Wrapper 및 추가 파일 사용 위치.
2) 붙여넣기 - > 실제 구현은 여기에 있습니다.
중요한 사항을 언급하면서 프로그램은 다음과 같이 나뉩니다.
linkedlist.c - > 드라이버 프로그램 포함
insert.c - > 삽입용 코드 포함linkedlist.h - > 필요한 노드 선언을 포함합니다.
insert.h - > 필요한 노드 삽입 선언을 포함합니다.
각 헤더 파일에서 다음으로 시작합니다.
#ifndef FILENAME_H #define FILENAME_H 선언 ... #endif
#ifndef, #define 및 #endif, 사이에 선언을 작성하는 이유는 하나의 동일한 헤더 파일이 호출될 때 데이터 유형, 변수 등과 같은 식별자의 다중 선언을 방지하기 위함입니다. 동일한 프로젝트에 속한 새 파일에서.
이 샘플 프로그램의 경우:
insert.h - > 삽입 노드의 선언과 노드 자체의 선언을 포함합니다.
컴파일러가 헤더 파일에서 선언을 볼 수 있음을 기억하는 것이 매우 중요하지만, 포함 선언이 있으면 컴파일러가 링크 단계로 이동하기 전에 각 .c 파일을 개별적으로 컴파일하기 때문에 오류가 발생합니다. ,
connectedlist.h - > 노드를 포함하는 도우미 파일 및 이를 사용하는 파일에 포함되어야 하는 해당 표시 선언.
insert.c - > #include "connectedlist.h"를 통해 노드 선언을 포함합니다. 에는 선언과 insert.h에 선언된 기타 모든 메서드 정의가 포함됩니다.
connectedlist.c - > 사용자가 필요한 위치에 정수 데이터를 삽입하도록 하는 무한 루프와 목록을 표시하는 메서드가 포함된 Simple Wrapper.
마지막으로 염두에 두어야 할 것은 의미가 없다는 것입니다. 포함 파일이 서로 겹치면 여러 번 재정의할 수 있고 오류가 발생할 수 있습니다.
위의 내용을 고려하여 적절한 루틴으로 신중하게 분할해야 합니다.
<표 테두리 = "0" cellpadding = "0 "cellspacing =" 0 ">
// connectedlist.h
# ifndef LINKED_LIST_H
# 정의 LINKED_LIST_H
구조체
노드 {
int
데이터;
struct
노드 * 다음;
<코드 클래스 = "일반">};
무효
display (
구조체
<코드 클래스 ="일반 "> 노드 * 임시);
# endif
insert.h
|
insert.c
< 코드 클래스 = "키워드 볼드"> 구조체 <코드 클래스 = "일반" > 노드 * 임시 = ( <코드 클래스 = "키워드 볼드"> 구조체 <코드 클래스 = "일반" "> 노드 *)
<코드 클래스 = " 일반 "> { <코드 class ="undefined spaces ">
< C/C++, Java 및 Python에서 큰 파일을 별도의 모듈로 분할 _files: QuestionsC/C++, Java 및 Python에서 큰 파일을 별도의 모듈로 분할 cos: QuestionsShopLatest questions Wiki |