130819.10일차

|

헤더


#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>



메인 


#include "130819.h"




// 자기 참조 구조체


/*

typedef struct Link

{

int kor;

Link * next;

} Node;



// 사용하고자 하는 배열의 크기를 모를 때 배열을 사용할 수 없기 때문에

// Linked List를 쓴다.



void main()

{

Node m,w,z;

m.kor=10;

w.kor=20;

z.kor=30;


printf("m.kor : %d\n",m.kor);

printf("w.kor : %d\n",w.kor);

printf("z.kor : %d\n",z.kor);

printf("\n");




Node * ap = &m;

ap->kor=40;

ap = &w;

ap->kor=50;

ap = &z;

ap->kor=60;


printf("m.kor : %d\n",m.kor);

printf("w.kor : %d\n",w.kor);

printf("z.kor : %d\n",z.kor);

printf("\n");


ap = &m;


// 동적할당 받으면 이름을 못쓴다.

// 만들때부터 연결을 해서 만들어야 한다.


ap->kor = 70;

ap->next = &w;


ap->next->kor = 80;

ap->next->next = &z;


ap->next->next->kor = 90;

ap->next->next->next = '\0';

printf("m.kor : %d\n",m.kor);

printf("w.kor : %d\n",w.kor);

printf("z.kor : %d\n",z.kor);

printf("\n");



// 반복문을 돌면 이동이 들어가야된다.

// ap = ap->next ;

// ap->next가 NULL일때까지 반복문


int i=90;

while( true ){

ap->kor = i+=10 ;

if ( ap->next == NULL ) break;

ap = ap->next;


}

}


*/






// Linked List

// 단일 연결 리스트 (Single Linked List)

// 단일 환상 연결 리스트

// 이중 연결 리스트 (Double Linked List)

// 이중 환상 연결 리스트




//////////////////////////// 예제 ////////////////////////


//////////////////////////// 헤더 ////////////////////////

static int cnt=0;


typedef struct Link {

char name[10]; // 이름 4자 까지 가능

int score;

Link * next;

} Node;


int menu() ;

void display( Node * ap );

Node * add( Node * ap ) ; 

Node * append( Node * ap );

Node * del( Node * ap);

void search( Node * ap );

Node * clear( Node * ap ) ;


//////////////////////////// 메인 ////////////////////////

void main() 

{

// 사전 작업

Node * head, * tail; // *를 다 넣는다

head = tail = new Node;

tail->next = NULL;


while ( true ) {

switch ( menu() ) { 

case 1 : display( head ); break; // 출력

case 2 : tail = add( tail ); break; // 생성

case 3 : head = append( head ); break; // 삽입 // 포인터가 n-2번 이동해야한다 // 노드 연결은 뒤에서 부터

case 4 : head = del( head ); break; // 삭제

case 5 : search(head); break; // 검색

case 6 : head = clear( head ); break; // 전체 삭제

case 7 : puts(""); return; // 종료 // main에 있는 return은 프로그램을 종료하라는 뜻.

//default : puts("\n\t잘못 입력했습니다.\n\t1~7 사이로 입력하세요.");

getch(); // 중간에 텀 주기 위함

}

}

}




//////////////////////////// 함수 ////////////////////////


//void clear( Node * ap ) {

// // Linked List 전체를 반납

// for ( int i=0 ; i<cnt-1 ; i++ ) {

// Node * temp = ap->next;

// ap->next = ap; 

// delete temp;

// }

//

// while (true) {

// Node * temp = ap->next;

// if(temp == NULL ) break;

// delete ap;


Node * clear( Node * ap ) {

while (ap->next != NULL) {

Node * temp = ap->next;

delete ap; 

ap = temp;

}

cnt=0;


printf("\n\t전체 삭제가 완료되었습니다.\n");

getch();

return ap;

}



void search( Node * ap ) {

// 1. 이름으로 검색

// 2. 점수로 검색

// 검색 방법 입력 받고

// 중복된 데이터가 있다면 모두 출력

// 1번 홍길동 50점


int type, jumsu, bunho;

char irum[10];

printf("\n\t1. 이름\n\t2. 점수\n\t3. 번호");

printf("\n\t검색할 방법을 선택해 주십시오 : ");

scanf("%d",&type);

while ( type < 4 || type > 0) {

int i=0;


if ( type == 1 ) {

printf("\n\t이름 입력 : ");

scanf("%s", &irum);

while ( ap->next != NULL ){

i++;

if ( strcmp(irum,ap->name) == 0 ) {

printf("\n\t%d번 %s %d점", i, ap->name, ap->score );

}

ap = ap->next;

printf("\n\n\t아무키나 눌러주십시오");

break;


} else if ( type == 2 ) {

printf("\n\t점수 입력 : ");

scanf("%d", &jumsu);

while ( ap->next != NULL ){

i++;

if ( ap->score == jumsu ) {

printf("\n\t%d번 %s %d점", i, ap->name, ap->score );

}

ap = ap->next;

printf("\n\n\t아무키나 눌러주십시오");

break;


} else if ( type == 3 ) {

printf("\n\t번호 입력 : ");

scanf("%d", &bunho);

while ( ap->next != NULL ){

i++;

if ( i == bunho ) {

printf("\n\t%d번 %s %d점", i, ap->name, ap->score );

}

ap = ap->next;

printf("\n\n\t아무키나 눌러주십시오");

break;


} else { 

printf("\n\t다시 입력해 주십시오 : ");

scanf("%d",&type);

}

getch();

}





Node * del( Node * ap) {

Node * start = ap;


if ( cnt == 0 ) {

printf("\n\t데이터가 없습니다.");

puts("\n\t아무키나 누르세요");

return 0;

}


display( ap );

 

int loc;

do {

printf("\n\t삭제할 위치 : ");

scanf("%d", &loc);

if ( loc <= cnt ) break;

printf("\n\t%d개의 노드가 있습니다.", cnt);

} while (true); 


if ( loc == 1) { // 첫노드 삭제

start = ap->next;

cnt--;

delete ap;

return start;

} else { // 중간 노드 삭제

int i;

for ( i=0 ; i<loc-2 ; i++) {

ap=ap->next;

}

//delete ap->next;

Node * temp = ap->next;

ap->next = ap->next->next; // (temp->next)

delete temp;

cnt --;

return start;

}

}





Node * append( Node * ap) {

Node * start = ap;

Node * item = new Node; 

puts("\n\t삽입할 정보를 입력 해주세요.\n\n");

printf("\t이름 : ");

scanf("%s", item->name);

printf("\t점수 : ");

scanf("%d", &item->score);

display( ap );


int loc;

do {

printf("\n\t삽입할 위치 : ");

scanf("%d", &loc);

if ( loc <= cnt ) break;

printf("\n\t%d개의 노드가 있습니다.", cnt);

} while (true); 


if ( loc == 1) { // 첫노드에 추가

item->next = ap;

cnt ++;

return item;

} else { // 중간 노드에 추가

int i;

for ( i=0 ; i<loc-2 ; i++) {

ap=ap->next;

}

item->next = ap->next;

ap->next = item;

cnt ++;

return start;

}

}





Node * add( Node * ap ) {

char irum[10];

int jumsu;

printf("\n\t정보를 입력해주세요\n");

printf("\t이름 : ");

scanf("%s", irum);

printf("\t점수 : ");

scanf("%d", &jumsu);


strcpy( ap->name, irum);

ap->score = jumsu;

ap->next = new Node; // 현재노드 끝에 새 노드 추가

ap = ap->next;

ap->next = NULL;

cnt++;


return ap;

}



void display( Node * ap ) {

int num=0;

if ( cnt == 0 ) {

printf("\n\t데이터가 없습니다.\n");

puts("\n\t아무키나 누르세요");

getch();

} else {

printf("\n\t%d명의 데이터가 있습니다.\n", cnt);

while ( ap->next != NULL ){

printf("\t[%d번째] %s의 점수는 %d점\n",

++num, ap->name, ap->score );

ap = ap->next;

}

puts("\n\t아무키나 누르세요");

getch();

}

}




int menu() 

{

system("cls");

printf("\n\t-----------------------\n");

puts("\t메뉴를 선택하세요\n");

puts("\t1. 출력");

puts("\t2. 생성");

puts("\t3. 삽입");

puts("\t4. 삭제");

puts("\t5. 검색");

puts("\t6. 전체삭제");

puts("\t7. 종료");

printf("\t-----------------------\n");


int select;

printf("\t선택 : ");

scanf("%d", &select);


while (1) {

if ( select<8 && select>0 ) break;

else 

{

//printf("입력한값 : %d",select);

printf("\n\t잘못 입력했습니다.\n\t1~8 사이로 입력하세요.");

printf("\n\t선택 : ");

scanf("%d", &select);

//getch();

}


return select;

}





저작자 표시 비영리 변경 금지
신고

'Study > C, C++' 카테고리의 다른 글

130821.12일차  (0) 2013.08.22
130820.11일차  (0) 2013.08.22
130819.10일차  (0) 2013.08.22
130816.9일차  (0) 2013.08.19
130814.8일차  (0) 2013.08.19
130813.7일차  (0) 2013.08.19
Trackback 0 And Comment 0