1.리스트란?

 - 리스트(list), 선형리스트(linear list) : 순서를 가진 항목들의 모임.

 

2. 리스트의 연산

 - 새로운 항목을 리스트의 처음, 중간 , 끝에 추가한다.

 - 기존의 항목을 리스트의 임의의 위치에서 삭제한다.

 - 모든 항목을 삭제한다.

 - 리스트가 특정한 항목을 가지고 있는지 확인.

 - 리스트의 특정위치 항목을 반환.

 - 리스트의 항목개수를 세고, 안에 비었는지 꽉 찼는지 채크한다.

 - 리스트 안의 모든 항목을 표시.

 

3.리스트 구현 방법

 - 배열을 이용하는 방법

→ 구현방법이 간단함.

→ 삽입 및 삭제 할 경우 오버헤드 발생.

→ 항목의 개수가 제한됨.

 

 - 연결리스트를 이용하는 방법

→ 구현방법이 복잡함.

→ 삽입,삭제가 효율적임.

→ 크기가 별도로 제한되지 않음.

 

4. 배열로 구현된 리스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include<stdio.h>
#include<stdlib.h>
 
#define MAX_LIST_SIZE 100 // 배열의  최대 사이즈 선언
 
typedef int element;  //리스트의 요소 선언 
typedef struct
{
    int list[MAX_LIST_SIZE]; //배열 정의
    int length;                 //현재 배열에 저장된 자료들의 길이
}ArrayListType;
 
void error(char *message)    // 오류 처리 함수
{
    fprintf(stderr, "%s \n", message);
    exit(1);
}
 
void init(ArrayListType *L) //리스트 초기화 함수.
{
    L->length = 0;
}
 
// list가 비어있으면 1을 반환.
//그렇치 않으면 0을 반환. 
int is_empty(ArrayListType *L) 
{
    return L->length == MAX_LIST_SIZE;
}
 
//list가 가득 차있으면 1을 반환
//그렇치 않으면 0을 반환
int is_full(ArrayListType *L) {
    return L->length == MAX_LIST_SIZE;
}
//list출력 함수.
void display(ArrayListType *L)
{
    int i;
    for (i = 0; i<L->length; i++)
        printf("%d \n", L->list[i]);
}
 
//position : 삽입하고자 하는 위치
//item : 삽입하고자 하는 자료
void add(ArrayListType *L, int position, element item)
{
    if (!is_full(L) && (position >= 0&& (position <= L->length))
    {
        int i;
        for (i = (L->length - 1); i >= position; i--)
            L->list[i + 1= L->list[i];
        L->list[position] = item;
        L->length++;
    }
}
//position : 삭제하고자 하는 위치
//반환값 : 삭제되는 자료
element _delete_(ArrayListType *L, int position)
{
    int i;
    element item;
    if (position<|| position >= L->length)
        error("위치오류");
    item = L->list[position];
    for (i = position; i<(L->length - 1); i++)
        L->list[i] = L->list[i + 1];
    L->length--;
    return item;
}
 
//position의 위치의 요소를 item으로 대채
void replace(ArrayListType *L, int position, element item)
{
    if (is_empty(L) == 1)
        printf("비어있습니다.");
    else if (position<|| position >= L->length)
        printf("위치오류");
 
    L->list[position] = item;
}
 
//현재 리스트의 길이를 구해서 출력.
void get_length(ArrayListType *L)
{
    int len;
    len = L->length;
    printf("리스트의 길이는 %d 입니다. \n", len);
}
 
//init와 같은 리스트 초기화 함수.
void clear(ArrayListType *L)
{
    L->length = 0;
}
 
int main()
{
    ArrayListType list1; 
    ArrayListType *plist;
    //ArrayListType의 구조체를 정적으로 생성하고 이 구조체를 가리키는
    // 포인터를 함수의 매개변수로 전달.
    init(&list1);
    add(&list1, 010);
    add(&list1, 020);
    add(&list1, 030);
    display(&list1);
    get_length(&list1);
 
    //ArrayListType의 구조체를 동적으로 생성하고 이 구조체를 가리키는
    // 포인터를 함수의 매개변수로 전달.
    plist = (ArrayListType *)malloc(sizeof(ArrayListType));
    init(plist);
    add(plist, 010);
    add(plist, 020);
    add(plist, 030);
 
    is_empty(plist);
    get_length(plist);
    add(plist, 040);
    add(plist, 050);
    add(plist, 060);
    get_length(plist);
 
    clear(plist);
 
    free(plist);
 
    return 0;
}
cs

 

이렇듯 순차적으로 만들어져서 각 list에 저장된것을 알 수 가 있다.

 

'programing > C,자료구조' 카테고리의 다른 글

리스트(3) - 이중 연결 리스트  (0) 2017.04.07
리스트 - (2) 선형 리스트, 원형 리스트  (0) 2017.04.03
C언어 pragma  (0) 2017.03.28
순환  (0) 2017.03.13
자료구조와 알고리즘  (0) 2017.03.08

#pragma : 컴퍼일하기 전에 필요한 작업을 컴파일러에게 전달하는 전처리 구문

#pragma [comment|warning|pack|once|...]

comment  : 보통 라이브러리를 인클루드할때 사용

warning   : 특정 경고를 무시

pack       : 메모리 최적화

once      : 특정 명령을 한번만 컴파일하도록

 

#pragma comment( type, "filename|filepath");

type : lib, linker등을 입력

filename|filepath : 파일명이나 경로명을 입력

 

#pragma warning(warning specifier : warning number);

warning specifier : disable - 경고 무시

   once - 동일 경고 한번만 알림

   error - 경고를 에러로 알림

   default - 원상태로 돌림

warning number : 경고 번호

 

#pragma pack(push|pop , pack size);

push : pack할 자료형의 앞에서 사용

pop  : pack할 자료형의 뒤에서 사용

pack size : 묶음단위의 byte크기(ex- 1,2,4,8,16)

 

'programing > C,자료구조' 카테고리의 다른 글

리스트 - (2) 선형 리스트, 원형 리스트  (0) 2017.04.03
리스트 - (1) 리스트의 특징, 배열로 구현된 리스트  (1) 2017.04.03
순환  (0) 2017.03.13
자료구조와 알고리즘  (0) 2017.03.08
C언어 란?  (0) 2016.11.29

순환이란?

 - 알고리즘이나 함수가 수행도중에 자기 자신을 다시 호출하여 문제를 해결하는 기법

 

조건

 - 문제의 크기는 점점 작아져야 함.

*분할정복

 -호출이 끝나는 종료 조건이 있어야 함.

 

1. 팩토리얼 프로그래밍

팩토리얼의 정의

 

             ┌──── n = 0      1

n! ──┤

            └──── n>=1      n*(n-1)!

 

우선 C언어에서의 구현

 

 

팩토리얼 함수의 호출 순서

factorial(4) = 4 *factorial(3) = 4 * 3 * factorial(2) = 4 * 3 * 2 * factorial(1) = 4 * 3 *2 * 1 = 24

 

이와 마찬가지로 파이썬에서도 구현 가능

 

코드를 설명하자면 변수 a가 int형 타입을 입력을 받은다음 팩토리얼 함수를 만난다. 그럼 if문을 만났지만 조건이 부함되어 실행이 되지 않고

else문을 만나서 바로 실행이 된다. 함수 호출함수는 위에서 쓰인 C언어와 동일하다.

 

팩토리얼 함수의 호출 순서

factorial(4) = 4 *factorial(3) = 4 * 3 * factorial(2) = 4 * 3 * 2 * factorial(1) = 4 * 3 *2 * 1 = 24

 

 

조건문으로 쓰인 팩토리얼을 반복문으로도 바꿀수가 있다.

결과값은 같다 하지만 속도차이가 조금 있다.

마찬가지로 파이썬에서도 바꿀수가 있다.

마찬가지로 결과값은 같다.

 

 

EX)

      

 

 

이 코드를 실행하여 어떤값이 반환되어 출력되는지 확인 후 반복문을 함수로 변환 작성 하시오. 

 

 - >우선 코드르 보면 main()함수에서 sub()함수를 불러서 인자 10을 넣었다. 그럼 sub()함수로 올라가서

if문에 조건이 맞지않아 else문으로 넘어간다. 여기서 10 +(10-3) + (7-3) +(4-3) = 22인것 을 알 수가 있다.

 

   

 

이와같이 결과값이 똑같은걸 알수가 있다.

마찬가지로 main()함수에서 sub()함수를 만나서 for문을 통해서 a라는변수가 0보다 클때 까지 돌아간다.

처음 들어간것은 10이 들거갔으며, 두번째는 7, 세번째는 4, 네번째는 1 이라는것을 알수가 있다.

for문바로 아래 계산을 통해 결과값이 리턴해준다는것을 알수가 있다.

 

 

자료구조란?

일상생활에서의 사물의 조직화(정리)

 - 현실을 프로그래밍적으로 표현하는것

 

 일상생활에서의 예

 자료구조

 물건을 쌓아 두는 것

 스텍

영화표 매표소의 줄

 큐

 할 일 리스트

 리스트

 영어사전

 사전,탐색구조

 지도

 그래프

 조직도

 트리

 

자료구조의 구조

 

단순구조 : 정수, 실수, 문자, 문자열

선형구조 : 리스트, 스택, 큐

비선형구조 : 트리, 그래프

 

프로그램 = 자료구조 + 알고리즘

 

알고리즘 : 컴퓨터로 문제를 풀기위한 단계적인 절차

 

알고리즘의 조건

입력 : 0개 이상의 입력이존재

출력 : 1개 이상의 출력이 존재

명백성 : 각명령어의 의미는 모호하지 않고,명백해야 함.

유한성 : 한정된 수의 단계후에는 종료.

유효성 : 각명령어들은 실행 가능한 연산이어야 함.

 

알고리즘의 성능분석

  - 필요성

     ◎ 예전의 컴퓨터에 비해 계산속도와 메모리가 증가.

     ◎ 여전히 프로그램의 효율성은 중요

→ 상용 프로그램의 규모 또한 엄청나게 커짐

→ 사용자들은 여전히 빠른 프로그램을 선호

 

  - 알고리즘의 성능 분석 기법

◎ 수행시간측정

→ 두 개의 알고리즘의 수행시간을 측정

→ 실제로 구현하는것이 필요

→ 동일한 하드웨어를 사용하여야함.

 

◎ 알고리즘의 복잡도 분석

→ 직접 구현하지 않고서도 수행 시간을 분석하는것

→ 알고리즘이 수행하는 연산의 횟수를 측정하여 비교

시간 복잡도 분석 : 수행시간분석

공간 복잡도 분석 : 수행시 필요로 하는 메모리 공간분석

 

 

 

 

'programing > C,자료구조' 카테고리의 다른 글

리스트 - (2) 선형 리스트, 원형 리스트  (0) 2017.04.03
리스트 - (1) 리스트의 특징, 배열로 구현된 리스트  (1) 2017.04.03
C언어 pragma  (0) 2017.03.28
순환  (0) 2017.03.13
C언어 란?  (0) 2016.11.29

1. C언어 란?

 

1972년 미국 벨 연구소의 리치(D. Ritchie)가 개발한 운영 체제나 언어 처리계 등의 시스템 기술에 적합한 프로그래밍 언어. 기본적인 프로그램 구조가 기술 가능하고, 비트 조작 등 세밀한 기술도 가능하다. 미니컴퓨터용 운영 체제인 유닉스의 대부분은 이 언어로 기술되어 있다. 최근에는 마이크로컴퓨터소프트웨어의 공통화를 꾀하기 위한 언어로서 보급되고 있다.

 

2. C언어의 구조 

 

3. C언어의 특징

 - 변수를 선언할시에 대문자와 소문자를 다르게 구분.

     만약 KOREA 와 korea 를 변수로 사용할시에 사람이 보았을떄는 KOREA 와 korea 대문자와 소문자 차이지뭐? 이렇게 생각할수 있지만,

     하지만 C언어 뿐만아니라 컴퓨터 모든 언어들이 다르게 취급한다.

 

-  C언어는 함수들의 집합체이다.

위에 그림과 같이 함수들의 집합체이며, 프로그램 작성시에도 마찬가지로 주 프로그램은 main()함수 내에서 작성해야 하며, main()함수 외에도

여러 함수들이 존재한다. 예를들면 #include<stdio.h>에도 표준 입ㆍ출력 함수가 내장되어 있다.

 

 - 다양한 자료형이 존재한다.

정수형 : int, char,long,short

실수형 :  float, double, long double

 이외 여러가지 자료형들이 존재함.

 

 

* C언어는 컴퓨터 와 사람이 컴파일러를 통해  소통하기 위한 역활을 한다.

  예를들면 내가 다른나라로 여행을 간다고 했을때 언어를 모르니 소통하기가 힘들다.

그럴떄는 번역가를 두어서 원활히 소통을 할수 있도록 한다.

컴퓨터도 마찬가지 이다. 컴파일을 통해 사람과 컴퓨터 간의 번역가 역활을 한다.

 

사람(C언어 - .c ) ---> 컴파일--->기계어 실행

 

 - 절차적 지향적 특징. 이식성이 좋음. 

 

 

 

 

 

위 자료에서 1번과 2번는 위키백과를 참고 하였으며, 3번은 학교에서 배운거 또는 여러 문서를 보고 배운것을 참조 하였습니다.

'programing > C,자료구조' 카테고리의 다른 글

리스트 - (2) 선형 리스트, 원형 리스트  (0) 2017.04.03
리스트 - (1) 리스트의 특징, 배열로 구현된 리스트  (1) 2017.04.03
C언어 pragma  (0) 2017.03.28
순환  (0) 2017.03.13
자료구조와 알고리즘  (0) 2017.03.08

+ Recent posts

티스토리 친구하기