개념/자료구조

배열 - 1차원 배열

웅드 2023. 11. 27. 18:39
  • 동일한 데이터형 변수의 집합을 의미한다.
  • 메모리상의 연속적인 공간에 할당된다.
  • 배열 명은 그 배열의 시작 주소 상수이다.
  • 배열 요소는 첨자로 구분하며 첨자는 0부터 시작된다.

 

1차원 배열

배열 전체의 초기화는 배열 선언문에서만 가능하다.

초기화 데이터는 중괄호로 묶어준다.

배열 요소의 개수보다 초기화 데이터가 많으면 error가 발생한다.

배열 선언 시 배열 크기는 생략할 수 없지만 초기화 데이터가 있는 경우에는 배열 크기를 생략할 수 있다.

문자열 char 배열에 저장할 때에는 배열 크기를 문자열의 길이 +1 (NULL 저장 공간)만큼 정해야 한다.

 

배열의 삽입 및 삭제

a배열의 n번 데이터를 삭제하면 (n+1)번 이후의 데이터들을 앞으로 당겨주는 작업을 해야한다.

void deleteData(int *ap, int *pcount, int index);
void insertData(int *ap, int *pcount, int index, int data);
void printArray(int *ap, int cnt);

int main(){

    int num[10] = {1,2,3,4,5,6,7,8,9,10};
    int count = 10;
    printArray(num, count);
    deleteData(num, &count, 4);
    printArray(num, count);
    
    getchar();
    return0;
}

void deleteData(int *ap, int *pcount, int index){

    int i;
    if( intdex < *pcount ){
        (*pcount)--;
        for(i = index; i < *pcount; i++){
            ap[i] = ap[i + 1];
        }
    }
    else return;
}
// 1번째 printArray 출력 : 1 2 3 4 5 6 7 8 9 10
// 2번째 printArray 출력 : 1 2 3 4 6 7 8 9 10 -> 4번 째 index가 제거됨

 

a배열에 데이터를 추가하려면 데이터들을 뒤로 밀어준 후에 n번에 데이터를 저장해주어야 한다.

단, 추가 시에는 실제 배열 크기를 초과해서 저장하지 않도록 유의하야한다.

 

void deleteData(int *ap, int *pcount, int index);
void insertData(int *ap, int *pcount, int index, int data);
void printArray(int *ap, int cnt);

int main(){

    int num[10] = {1,2,3,4,5,6,7};
    int count = 7;
    printArray(num, count);
    insertData(num, &count, 4, 9);
    printArray(num, count);
    
    getchar();
    return0;
}

void insertData(int *ap, int *pcount, int index, int data){

    int i;
    if( intdex <= *pcount ){
        
        for(i = *pcount; i > index; i--){
            ap[i] = ap[i - 1]; // 데이터들을 하나씩 뒤로 밀어서 저장한다.
        }
       ap[index] = data;
       (*pcount)++;
    }
    else return;
}
// 1번째 printArray 출력 : 1 2 3 4 5 6 7
// 2번째 printArray 출력 : 1 2 3 4 9 5 6 7 -> 4번 째 index에 9가 추가됨

 

데이터 검색하기

 

int num[10] 배열을 1 ~ 20 사이의 난수로 초기화 한 후 배열 내의 데이터에서 사용자가 지정한 정수를 검색하여 배열 내의 저장된 위치를 출력한다.

-> 순차 검색 : 선형 자료구조에서 데이터를 처음부터 순차적으로 하나씩 비교하면서 찾는 방법

void printArray(int *ap, unsigned int cnt);
void initArray(int *ap, unsignde int size);
int searchArray(int *ap, unsigned int size, int sData);

int main(){

    int num[10]; // 데이터 저장 배열
    unsigned int size; // 배열의 크기 저장
    int sData; // 검색할 데이터 저장
    int res=0; // 검색 결과 저장
    int i;
    size = sizeof(num)/sizeof(num[0]); // 배열 크기 계산
    
    initArray(num, size);
    printArray(num, size);
    
    for(i = 0; i < 5; i++){
    	cout << "검색할 정수를 입력하세요 " << endl;
        cin >> &sData;
        res = searchArray(num, size, sData);
        if(res != -1) cout << sData << "는 " << res << " 번째에 있습니다. " << endl;
        else cout << sData << "는 " << "존재하지 않습니다.";
    }

    return 0;
}

int searchArray(int *ap, unsigned int size, int sData){

    int position = -1;
    unsigned int i;
    for(int i=0; i < size; i++){
    	if(ap[i] == sData){
        	position = i;
            break;
        }
    }
    return position;
}

 

회문 검사 프로그램

회문은 "level", 과 같이 앞으로 읽으나 뒤로 읽으나 똑 같은 단어이다.

입력된 영어 단어의 회문 여부를 검사하는 프로그램을 작성해라.

반복 수행하고 end를 입력하면 종료하자.

void inputString(char *cp);
int checkPalindrome(char *cp);

int main(){

    char str[80];
    int res;
    
    inputString(str);
    while(strcmp(str,"end")!=0){
    	res = checkPalindrome(str);
        if(res==1) cout << str <<"은 회문입니다." << endl;
        else cout << str <<"은 회문이 아닙니다." << endl;
        inputString(str);
    }
    return 0;
}

void inputString(char *cp){

    cout << "회문을 검사할 문자열을 입력하세요 : " << endl;
    cin >> cp;
    return;
}

int checkPalindrome(char *cp){

    int length;
    int check = 1;
    length = strlen(cp);
    for(int i = 0; i<length/2; i++){
    	if(cp[i] != cp[length-i-1]){
        	check = 0;
            break;
        }
    }
    return check;
}
반응형