4 List 1 typedef struct list Node list

  • Slides: 48
Download presentation
제 4장 List

제 4장 List

(1) 노드 생성 typedef struct list. Node *list. Ptr; struct list. Node { char

(1) 노드 생성 typedef struct list. Node *list. Ptr; struct list. Node { char data[10]; list. Ptr link; }; list. Ptr ptr = NULL;

(2) 2개의 노드 연결 ① 첫 번째, 두 번째 노드 생성 list. Ptr first,

(2) 2개의 노드 연결 ① 첫 번째, 두 번째 노드 생성 list. Ptr first, second, ptr; first = (list. Ptr)malloc(sizeof(list. Node)); second = (list. Ptr)malloc(sizeof(list. Node)); ② 'first'노드에는 "SUNDAY"를, 'second'노드에는 "TUESDAY"를 자료 필드에 저장. strcpy(first→data, "SUNDAY"); strcpy(second→data, "TUESDAY");

(5) 리스트 출력과 삭제 리스트 출력 void print. List(list. Ptr ptr) { for( ;

(5) 리스트 출력과 삭제 리스트 출력 void print. List(list. Ptr ptr) { for( ; ptr = ptr→link) printf("%s", ptr→data); } 리스트 삭제 void erase(list. Ptr *ptr) { list. Ptr temp; while(*ptr) { temp = *ptr; *ptr = (*ptr)→link; free(temp); } }

(1) 스택에 노드 첨가(Push) void push(stack. Ptr *top, list. Node item) { ① 새로운

(1) 스택에 노드 첨가(Push) void push(stack. Ptr *top, list. Node item) { ① 새로운 노드'temp'를 생성. stack. Ptr temp = (stack. Ptr)malloc(sizeof(stack)); 노드'temp'의'item'필드에 저장할 자료'item'을 저장. temp→item = item; ②'temp'의 링크 필드가'top'을 가리키게 한다. temp→link = *top; ③ 새로 삽입된'temp'가 새로운'top'이 된다. *top = temp; } 함수 호출 - push(&top, item);

4. 4. 2 단순 연결 리스트를 이용한 큐 노드 구조의 정의. typedef struct queue

4. 4. 2 단순 연결 리스트를 이용한 큐 노드 구조의 정의. typedef struct queue *queue. Ptr; struct queue { list. Node item; queue. Ptr link; }; queue. Ptr front, rear; front = NULL;

(1) 큐에 노드 첨가(add. Q) void add. Q(queue. Ptr *front, queue. Ptr *rear, list.

(1) 큐에 노드 첨가(add. Q) void add. Q(queue. Ptr *front, queue. Ptr *rear, list. Node item) { /* 삽입할 노드'temp'를 생성. 'temp'의 item에 저장할 자료 저장, 링크 필드(item)에'NULL'을 저장*/ queue. Ptr temp = (queue. Ptr)malloc(sizeof(queue)); temp→item = item; temp→link = NULL; if(*front) (*rear)→link = temp; /* 이미 큐에 저장된 노드가 있으면 가장 뒤(rear) 노드와 링크 필드에'temp'를 첨가*/ else *front = temp; /*큐에 이미 저장된 노드가 없으면, 'temp'를'front'로 한다*/ *rear=temp; /* 방금 첨가된'temp'가 새로이'rear'가 된다*/ } 함수호출 - add. Q(&front, &rear, item);

4. 5. 2 단순 연결 리스트를 이용한 다항식 표현 • 계수, 지수, 링크 구조의

4. 5. 2 단순 연결 리스트를 이용한 다항식 표현 • 계수, 지수, 링크 구조의 표현 typedef struct poly. Node *poly. Ptr; struct poly. Node { int coefficient; /* 계수 */ }; int exponent; /* 지수 */ poly. Ptr link; /* 링크 */

4. 5. 3 다항식 덧셈 #define COMPARE(x, y) (((x) < (y)) ? -1 :

4. 5. 3 다항식 덧셈 #define COMPARE(x, y) (((x) < (y)) ? -1 : ((x) == (y) ? 0 : 1 case 0 : /* a→exponent == b→exponent */ poly. Ptr padd(poly. Ptr a, poly. Ptr b) sum = a→coefficient + b→coefficient; { if(sum) attach(sum, a→exponent, &rear); /* 다항식 a와 b를 덧셈하는 프로그램 */ poly. Ptr front, rear, temp; a = a→link; b= b→link; break; int sum; case 1 : /* a→exponent > b→exponent */ rear = (poly. Ptr)malloc(sizeof(poly. Node)); attach(a→coefficient, a→exponent, &rear); if(IS_FULL(rear)) { /*큐가 찼는지를 검사 */ a = a→link; fprintf(stderr, "The memory is fulln"); exit(1); } } /* 다항식 a와 다항식 b의 나머지를 복사 */ front = rear; for( ; a; a = a→link) attach(a→coefficient, a→exponent, &rear); while(a && b) for( ; b; b = b→link) attach(b→coefficient, b→exponent, &rear); switch(COMPARE(a→exponent, b→exponent)){ case -1 : /* a→exponent < b→exponent */ rear→link = NULL; /* 필요 없는 초기 노드를 삭제 */ attach(b→coefficient, b→exponent, &rear); temp = front; front = front→link; free(temp); b = b→link; return front; break; }

4. 5. 3 다항식 덧셈 void attach(float coefficient, int exponent, poly. Ptr *ptr) {

4. 5. 3 다항식 덧셈 void attach(float coefficient, int exponent, poly. Ptr *ptr) { /* 새로운 노드를 만들어서 ptr이 가리키는 위치에 저장 */ poly. Ptr temp; temp = (poly. Ptr)malloc(sizeof(poly. Node)); if(IS_FULL(temp)) { fprintf(stderr, "The memory is fulln"); exit(1); } temp→coefficient = coefficient; temp→exponent = exponent; (*ptr)→link = temp; *ptr = temp; }

4. 6 주요 리스트 연산 (1) List를 역순으로 만든다. list. Ptr invert(list. Ptr lead)

4. 6 주요 리스트 연산 (1) List를 역순으로 만든다. list. Ptr invert(list. Ptr lead) { list. Ptr middle, trail; middle = NULL; while(lead) { trail = middle; middle=lead; lead=lead→link; middle→link=trail; } return middle; }

(2) 두 List 연결하기 list. Ptr concatenate(list. Ptr ptr 1, list. Ptr ptr 2)

(2) 두 List 연결하기 list. Ptr concatenate(list. Ptr ptr 1, list. Ptr ptr 2) { list. Ptr temp; 'ptr 1'이 없으면 if(!(ptr 1)) /* !(ptr 1) */ 'ptr 2'를 반환한다. return ptr 2; else { 'ptr 1'이 존재하고, 'ptr 2'도 존재한다면 if(ptr 2) { 'ptr 1'의 마지막 노드를 찾아서 for(temp = ptr 1; temp→link != NULL; temp = temp→link); 'ptr 1'의 마지막 노드의 링크 필드가'ptr 2'를 가리키게 한다. temp→link = ptr 2; } 두 개의 리스트가 연결된 뒤'ptr 1'을 반환한다. return ptr 1; } }

(3) 원형 List 길이 계산 int length(list. Ptr ptr) { list. Ptr temp; 길이를

(3) 원형 List 길이 계산 int length(list. Ptr ptr) { list. Ptr temp; 길이를 저장한 변수'count'를 정의한다. int count = 0; if(ptr) { temp = ptr; 리스트'ptr'의 노드 길이를 계산한다. do { count++; temp = temp→link; }while(temp != ptr); } 길이를 반환한다. return count; }

(2) 노드 삭제 void ddelete(node. Ptr head. Node, node. Ptr deleted) { 삭제 하고자

(2) 노드 삭제 void ddelete(node. Ptr head. Node, node. Ptr deleted) { 삭제 하고자 하는 노드가 head node이면 허용하지 않는다. if(head. Node == deleted) printf("not Permitted"); else { 그렇지 않으면'deleted'의 llink와 rlink를 다음과 같이 연결한다. ①deleted→llink→rlink = deleted→rlink; ②deleted→rlink→llink = deleted→llink; free(deleted); } }