손잡이 지도 작성 데이터 구조 (1) - C 언어 기초

머리말
저 는 대학 에서 컴퓨터 관련 학과 가 아니 기 때문에 대학 에서 유일 하 게 배 운 프로 그래 밍 언어 가 바로 C 언어 입 니까? 아니면 대학 에서 공 부 했 습 니까? 지금까지 4 년 이 넘 었 고 중간 에 코드 를 별로 쓰 지 않 았 습 니 다.그래서 지금 은 데이터 구조 관련 서적 을 읽 을 때 많은 코드 가 실현 되 는 것 이 생소 하기 때문에 본 격 적 인 학습 을 시작 하기 전에 데이터 구조 에서 자주 사용 되 는 C 언어의 기 초 를 되 돌아 본다.만약 당신 도 저 와 같이 전업 하고 중도 에 출가 를 한다 면 본 고의 내용 에 대해 의문 이나 이의 가 있 으 면 함께 교류 하 는 것 을 환영 합 니 다.본인 은 재능 이 부족 하고 학문 이 얕 으 니 내용 이 틀 리 면 지적 을 해 주 십시오.
조건 부 컴 파일
하나의 헤더 파일 이 두 번 인용 되면 컴 파일 러 는 두 번 의 헤더 파일 의 내용 을 처리 하 는데 오류 가 발생 할 수 있 습 니 다.이러한 상황 을 방지 하기 위해 표준 적 인 방법 은 파일 의 전체 내용 을 조건 부 컴 파일 문 에 두 는 것 이다. 다음 과 같다.
#ifndef LINKLIST_H
#define LINKLIST_H

typedef int ElementType;
typedef struct Node *LinkList;

#endif

이런 구 조 는 통상 적 으로 말 하 는 포장 기 \ # ifndef 이다.헤더 파일 을 다시 인용 할 때 조건 은 가짜 입 니 다. LINKLIST 때 문 입 니 다.H 가 정의 되 었 습 니 다.이 때 프 리 프로세서 가 파일 의 전체 내용 을 건 너 뛰 고 컴 파일 러 는 무시 합 니 다.
포인터
C 언어의 정 수 는 바로 그의 지침 이다. 지침 조작 은 이미 만들어 진 각종 데이터 구 조 를 상당히 편리 하 게 조작 할 수 있다.이 동시에 C 언어의 지침 도 초보 자 들 이 이해 하기 어 려 운 부분 이다. 여기 서 지침 의 지식 점 을 간단하게 요약 한다.
지침 의 성명 및 본질
우선, 포인터 자체 가 메모리 의 주 소 를 대표 하고 있다.이 주소 에 따라 우 리 는 주소 가 가리 키 는 메모리 의 내용 을 조작 할 수 있다.여기 서 우 리 는 흔히 볼 수 있 는 지침 과 관련 된 성명 을 귀납 한다.
  • 변수 유형 (int / char / float. etc) + "*" + 변수: 변 수 를 가리 키 는 지침, 즉 포인터 변 수 를 설명 합 니 다.
  • "*" + 포인터 변수: 가리 키 는 주소 메모리 에 저 장 된 내용 입 니 다.
  • "&" + 변수: 이 변수 가 있 는 주소 입 니 다.다음은 실례 를 결합 하여 설명 한다.
  • int	*ip;    	//         
    int	var = 10;	//        
    
    ip = &var;		//        var   
    int	var1 = *ip;	//              
    

    위의 변 수 를 디 버 깅 에서 보면 ip 자체 가 주소 값 이 고 ip 가 가리 키 는 내용 은 10 입 니 다.변수 var 1 의 값 도 10 이다.
    배열 과 포인터
    배열 을 설명 하 는 동시에 이 배열 의 변수 이름 은 배열 의 첫 번 째 요소 의 주 소 를 대표 합 니 다.따라서 배열 주 소 를 포인터 변수 에 부여 하면 다음 과 같은 두 가지 방식 을 사용 할 수 있 습 니 다.
    int	a[10];    		//      
    int	*ip = a;		//           
    int *ip1 = &a[0];	//           
    

    위의 두 가지 방식 은 완전히 등가 이다.또한, 첫 번 째 요소 의 주 소 를 ip 에 저장 하기 때문에 우 리 는 * ip, * (ip + 1), * (ip + 2) 등 을 사용 하여 배열 요 소 를 방문 할 수 있 습 니 다.
    할당 메모리
    malloc()
    우 리 는 데이터 구조 나 새로운 노드 를 만 들 때 충분 한 메모 리 를 할당 합 니 다. 이때 우 리 는 malloc 라 이브 러 리 함 수 를 사용 해 야 합 니 다.우선, 이 라 이브 러 리 함 수 를 사용 하려 면 헤더 파일 이 포함 되 어야 합 니 다.malloc (size t size) 함수 설명:
  • 필요 한 매개 변수: 메모리 블록 의 크기 는 바이트 단위 입 니 다.
  • 함수 기능: 필요 한 메모리 공간 분 배 를 요청 합 니 다.
  • 반환 값: 이 메모 리 를 가리 키 는 포인터 (주소).요청 에 실패 하면 NULL 로 돌아 갑 니 다.

  • 매개 변 수 를 되 돌려 주 는 것 은 주소 이기 때문에 이 함수 의 출력 값 을 포인터 변수 에 할당 할 수 있 습 니 다. 그러나 적당 한 종 류 를 할당 하 는 것 이 좋 습 니 다 (C + + 는 반드시 할당 해 야 합 니 다).또한 이 포인터 변 수 는 한 배열 의 첫 주 소 를 가리 키 면 배열 의 이름 으로 사용 할 수 있 습 니 다.
    sizeof 키워드
    일반 malloc 의 입력 매개 변 수 는 바이트 수 를 직접 입력 하지 않 습 니 다. 편리 하 게 크기 of 키 워드 를 매개 변수 로 입력 하여 서로 다른 유형 이나 구조 체 에 따라 동적 으로 분배 하 는 기능 을 실현 합 니 다.sizeof 연산 자 는 구조, 공용 체, 다른 사용자 정의 데이터 형식의 크기 를 가 져 오 는 데 사용 할 수 있 습 니 다.sizeof 의 문법 을 사용 하면:
    sizeof(data type)
    

    그 중에서 data type 은 크기 를 계산 하 는 데이터 형식 으로 구조, 공용 체 와 다른 사용자 정의 데이터 형식 을 포함한다.
    free()
    이전에 calloc, malloc 또는 realloc 를 호출 하여 분 배 된 메모리 공간 을 사용 합 니 다.데이터 구조, 관련 노드 를 삭제 할 때 자주 사용 합 니 다.free (* ptr) 함수 설명:
  • 필요 한 매개 변수: 메모리 의 포인터 (주소) 를 풀 어야 합 니 다.
  • 함수 기능: 지정 한 주소 의 메모 리 를 방출 합 니 다.
  • 반환 값: 반환 값 이 없습니다.

  • free 는 calloc, malloc 또는 realloc 에 대응 하기 때문에 완전한 프로그램 에서 쌍 을 이 루어 존재 해 야 합 니 다. 즉, free 메모리 공간 전에 반드시 이 메모리 가 calloc, malloc 또는 realloc 에 의 해 분배 되 어야 합 니 다.또한 메모리 공간 을 풀 었 지만 지침 은 여전히 존재 합 니 다. 원래 의 위 치 를 가리 키 고 있 습 니 다. 단지 안에서 읽 을 수 없 을 뿐 입 니 다. 이때 이 지침 을 야생 지침 이 라 고 부 릅 니 다. 우 리 는 free 이후 에 지침 을 비 워 야 합 니 다.
    다음은 메모리 할당 및 메모리 방출 을 위 한 예제 입 니 다.15 자 를 배치 할 수 있 는 문자열 포인터 변 수 를 만 들 고 sizeof (char) 프로그램 을 사용 하여 문자 에 필요 한 크기 를 스스로 계산 한 다음 15 자 를 곱 하면 15 자 를 배치 할 수 있 음 을 표시 합 니 다.그리고 free 를 사용 하여 내용 을 삭제 하고 마지막 으로 야생 지침 문 제 를 피하 기 위해 지침 을 비 웁 니 다.
    char *str = (char *)malloc(sizeof(char)*15);//  15     
    free(str);				//    
    str = NULL;				//    
    

    구조 체, 구조 체 지침
    하나의 데이터 구조 단원 에는 종종 각종 서로 다른 데이터 유형의 정보 가 포함 되 어 있다. 이때 우 리 는 그것들 을 하나의 전체 로 간주 해 야 한다. 이 를 위해 하나의 구조 체 를 정의 해 야 한다.
    구조 체 의 성명 정의
    구조 체 성명 정 의 는 struct 키 워드 를 사용 합 니 다. 사용 하기 가 매우 간단 합 니 다. 여기 서 직접 예 를 들 어 우리 가 결점 을 만 들 고 결점 은 정 보 를 포함 하 는 수치 와 지침 주소 가 있다 고 가정 합 니 다.
    struct Node {
         
    	int Element;
    	int *Next;
    };
    

    성명 이 성공 하면 우 리 는 순서대로 구조 변 수 를 만 들 수 있 습 니 다.
    struct Node List;
    

    위의 줄 을 보면 컴 파일 러 는 List 라 는 이름 으로 Node 구조 디자인 의 구조 변 수 를 만 듭 니 다.이때 struct Node 는 int, char 와 유사 한 성명 변수 역할 을 합 니 다.실제로 이 줄 은 아래 의 전체 판 의 간소화 이다.
    struct Node {
         
    	int Element;
    	int *Next;
    }List;
    

    또한 우 리 는 최초의 두 가지 조작 을 합 쳐 위 에 직접 쓰 는 것 이 더욱 간결 하 다 고 볼 수 있다.
    구조 지침
    int, char 와 유사 하 게 구조 체 가 성공 하면 포인터 변 수 를 설명 할 수 있 습 니 다. 이때 이 포인터 변 수 는 구조 포인터 라 고 부 르 고 구조 체 의 주 소 를 대표 할 수 있 습 니 다.구조 지침 은 구조 체 를 직접 사용 하 는 것 보다 다음 과 같은 장점 이 있다.
  • 조작 하기에 더욱 편리 하 다.
  • 주소 정보 하나만 전달 하기 때문에 실행 이 빠르다.
  • 초기의 C 실현 에서 구 조 는 매개 변수 로 함수 에 전달 할 수 없 지만 구 조 를 가리 키 는 지침 은 가능 하 다.

  • 성명 구조 지침 예 는 다음 과 같다.
    struct Node {
         
    	int Element;
    	int *Next;
    }*L;
    /*            */
    struct Node *L
    

    접근 구조 체 구성원
    구조 체 에 대해 서 는 연산 자 를 직접 사용 하여 구성원 을 방문 할 수 있다.구조 지침: 두 가지 조작 방식 이 있 는데 하 나 는 구조 지침 + "- >" + 구성원 명 입 니 다.다른 하 나 는 ("*" + 포인터 변수) + "." + 멤버 명 입 니 다.다음은 예시 입 니 다.
    //       
    List.Element;
    //        
    L->Element;
    (*L).Element;
    

    type: def 키워드
    마지막 으로 자주 사용 하 는 키 워드 를 소개 합 니 다.데이터 구 조 를 쓸 때 우 리 는 설명 이 편리 하고 코드 의 가 독성 을 높이 기 위해 많은 구조 와 데이터 형식 에 대해 더욱 이해 하기 쉬 운 이름 을 정의 합 니 다.type: def 는 특정한 유형 에 원 하 는 이름 을 만 들 수 있 습 니 다.\ # define 과 달리 제 시 된 기호 이름 은 유형 에 만 국한 되 고 값 을 맞 출 수 없습니다.여기 서 실례 를 들 어 설명 을 하 겠 습 니 다.
    typedef int QElemType;
    typedef struct QNode 
    {
         
    	QElemType data;
    	struct QNode *next;
    }QNode,*Queueptr;
    typedef sturct
    {
         
    	Queueptr front;
    	Queueptr rear;
    }linkQueue;
    

    이것 은 체인 대기 열의 구조 체 성명 코드 입 니 다.우선 첫 번 째 줄 은 int 형식 에 대해 QElemType 의 이름 을 지 었 습 니 다. 대기 열 에 있 는 요소 값 이 int 형의 수치 임 을 표시 합 니 다.이어서 첫 번 째 구조 체 를 살 펴 보 자.
  • struct QNode 는 구조 유형 으로 int, char 와 차이 가 많 지 않 고 유형 설명자 이다.
  • struct QNode * next 는 char * p 와 같은 struct QNode 형식의 지침 을 정의 합 니 다.
  • typedef struct QNode QNode: struct QNode 라 는 이름 이 너무 길 어서 아래 에 사용 하기 불편 하기 때문에 이름 을 하나 더 드 려 야 하기 때문에 struct QNode 와 QNode 를 사용 하 는 것 은 같은 뜻 입 니 다.
  • 다시 보기 * Queueptr, 이것 도 이름 을 바 꾸 는 것 입 니 다. 아래 에 struct QNode 형식의 지침 을 참조 하 는 것 을 편리 하 게 하기 위해 서 입 니 다.

  • 두 번 째 구조 체 의 정 의 를 보면 이 안 에는 두 개의 지침 이 정의 되 어 있 는데 각각 팀 의 머리 와 팀 의 꼬리 를 가리킨다.Queueptr front 도 struct QNode * front 라 고 쓸 수 있 습 니 다.
    마지막 으로 두 번 째 구조 체 의 struct 키 워드 는 다른 이름 이 없 지만 첫 번 째 구조 체 의 키워드 뒤에 QNode 가 하나 더 있 습 니 다. 그럼 여기 QNode 는 받 지 않 아 도 될까요?답 은 필요 하지 않 습 니 다. 이 구조 에서 자신의 유형 을 사 용 했 기 때 문 입 니 다: struct QNode * next;만약 사전에 성명 하지 않 았 다 면, 여기에 잘못 보 고 했 을 것 이다.
    참고 문헌
    《 C Primer Plus (제5 판) 》

    좋은 웹페이지 즐겨찾기