l 0 add Lastlist a add Lastlist b
예제 l 다음 각 연산의 결과는 무엇인가? (항목의 위치는 0부터 시작 한다고 가정) add. Last(list, a); add. Last(list b); add(list, 2, c); add(list, 1, d); delete(list, 2); replace(list, 1, e): list (a) 6
예제 #2 main() { int i, n; List. Type list 2; // 리스트 생성 // 리스트 연산 수행 add. Last(list 2, "마요네즈”); add. Last(list 2, "빵”); add. Last(list 2, "치즈”); add. Last(list 2, "우유”); // 리스트 출력 display(list 2); n = get. Length(list 2); printf("쇼핑해야할 항목수는 %d입니다. n", n); for(i=0; i<n; i++) printf("%d항목은 %s입니다. ¡°, i, get. Item(list 2, i)); }
리스트 구현: 배열 l 리스트 표현 list … length 리스트의 현재 크기 type list_type = record list: array [1. . MAX_LIST_SIZE] of integer; length: integer; end; typedef struct { int list[MAX_LIST_SIZE]; int length; } Array. List. Type; 10
리스트 연산 삽입 연산 (알고리즘) l typedef struct { int list[MAX_LIST_SIZE]; int length; } Array. List. Type; add(in out Array. List. Type list, in int pos, in int item) // pos 위치에 item을 삽입 { N 0 1 2 3 4 A B C D E A B C D A B C A B 5 // 배열이 꽉 차 있고, pos가 올바른 범위에 있는지 검사 E D E C D E } l N add. First(), add. Last()를 구현하라. 11
예제 typedef struct { int list[MAX_LIST_SIZE]; int length; } Array. List. Type; main() { Array. List. Type list // 리스트 생성 // Array. List. Type *list로 선언하면? // 리스트 연산 수행 init(&list); add. First(&list, 10); add(&list, 0, 20); add(&list, 0, 30); // 리스트 출력 display(list); } 15
단순 연결 리스트 표현 l (data, link)의 레코드로 표현 node data 자체 참조변수 link l SPARKS로 표현하면 type nodeptr = ↑node type node record data: integer; link: nodeptr; end; nodetpr list; list↑. data <- 10; list↑. link <- NULL; 21
삽입연산 (1) head가 NULL인 경우 head NULL new_node (2) prev가 NULL인 경우 head new_node NULL 23
삽입연산 (3) prev가 NULL이 아닌 경우 prev head NULL new_node 24
삽입 연산 l 알고리즘 list, prev의 NULL 유무 고려 procedure insert. Node(list, prev, new: nodeptr) // list: 헤드 포인터 // prev: 삽입될 위치의 선행 노드 // new: 새로 삽입될 노드 { return list; } 25
C 표현: 연결 리스트 l (data, link)의 레코드로 표현 data link type nodeptr = ↑node type node record data: integer; link: nodeptr; end; C의 구조체 typedef int element; typedef struct node { element data; struct node *link; } node; typedef int element; struct node; node* nodeptr; struct node { element data; nodeptr link; } node; 29
C 표현: 연결 리스트 l 노드의 생성(in C) typedef int element; typedef struct node { element data; struct node *link; } node; node *p; p = (node *) malloc(sizeof(node)); p data link 30
C 표현: 연결 리스트 l 노드의 생성(in C) typedef int element; struct node; node* nodeptr; struct node { element data; nodeptr link; } node; nodeptr p; p = (nodeptr) malloc(sizeof(node)); p data link 31
Test l 다음 각 C 문장의 의미는? int a; Int *p; a = 10; p = (int *)malloc(sizeof(int)); *p = a; 39
Test l 다음 각 C 문장의 의미는? int a; Int *p; a = 10; p = (int *)malloc(sizeof(int)*3); *p = a; *(p+1) = a + 20; *(p+2) = *p + 30; 40
Test l 다음 각 C 문장의 의미는? struct node { int data; struct node *link; } struct node p; p. data = 10; p. link = NULL; 41
Test l 다음 각 C 문장의 의미는? struct node { int data; struct node *link; } struct node p; struct node *list; p. data = 10; p. link = NULL; list = (struct node *)malloc(sizeof(struct node)); (*list). data = 20; list->link = NULL; 42
Test l 다음 각 C 문장의 의미는? struct node { int data; struct node *link; } struct node p; struct node *list; p. data = 10; p. Link = NULL; list = (struct node *)malloc(sizeof(struct node)); (*list). data = 20; list->link = &p; 43
struct node { int data; struct node *link; } Test l 다음에서 새로운 노드 q(data=30)를 생성하여 list 앞에서 삽 입하려면? struct node p; struct node *list, *q; p. data = 10; p. link = NULL; list = (struct node *)malloc(sizeof(struct node)); (*list). data = 20; list->link = &p; 44
struct node { int data; struct node *link; } Test l 다음에서 새로운 노드 r을 생성하여 list에서 두번째 노드로 삽입하려면? struct node p; struct node *list, *q, *r; p. data = 10; p. link = NULL; list = (struct node *)malloc(sizeof(struct node)); (*list). data = 20; list->link = &p; q = (struct node *)malloc(sizeof(struct node)); q->data = 20; q->link = list; list = q 45
- Slides: 47