Programing/C- programing

링크드 리스트의 추가,출력,삭제,찾기,바꾸기 소스

sosal 2010. 8. 19. 10:30
반응형

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


#include<iostream>
using namespace std;

class node{
private:
    int value;
public:
   
    node(int a){          // 생성자 함수를 이용하여 value 초기화
        value = a;
    }
    int getValue(){      // 값을 얻어오기 위한 함수
        return value;
    }
    void setValue(int val){
        value = val;
    }
    node *next;          // 다음 노드를 가리킬 포인터
};

node* first; // 첫번째 노드
node* newNode;
int count=0;   // 노드의 숫자를 관리할 conter

node* CreateNode(int val);
void AppendNode(node** first, node* newNode);
void find(int val);
void PrintNode();
void DeleteNode(int num);
void ChangeNode(int val,int val2);

int menu();

int main(){
    int a=1;
    int val;
    int val2;
    while(1){                    // 무한루프 돌리면서 메뉴와 인풋을 받아서~
        a = menu();
        if(a==1){
            cout<<"input : ";
            cin>>val;
            newNode = CreateNode(val);  //노드 추가!
            AppendNode(&first,newNode);
        }
        else if(a==2)
            PrintNode();        // 노드 출력~
        else if(a==3){
            cout<<"삭제하고자 하는 노드의 번호 : ";
            cin>>val;
            DeleteNode(val);
        }
        else if(a==4){
            cout<<"찾고자 하는 value를 입력하세요 : ";
            cin>>val;
            find(val);
        }
        else if(a==5){
            cout<<"바꾸고자 하는 노드의 번호 : ";
            cin>>val;
            cout<<"바꾸고자 하는 값을 입력하시오 : ";
            cin>>val2;
            ChangeNode(val,val2);
        }
        else if(a==6)
            break;
    }

    return 0;
}

node* CreateNode(int val){
    node *myNode = new node(val);    // 새로운 노드 new 를 이용하여 생성 및 value 초기화
    myNode->next=NULL;                 // next 노드 포인터에 NULL값 삽입.
    count++;
    return myNode;                           // 새로 만들어진 노드를 리턴
}


void AppendNode(node** first, node* newNode){
    if( (*first) == NULL)
        *first = newNode;                      // 첫번째 노드가 비어있을땐, 바로 first에 삽입!
    else{
        node *last = *first;
        while(last->next != NULL){         // 노드 마지막에 삽입하는것이므로.. 마지막까지 이동
            last = last->next;
        }
        last->next = newNode;               // 연결!
    }
}

void PrintNode(){
    node* print = first;
    int num=1;
    while(print != NULL){
        if(print->next == NULL)
            cout<<"["<<num<<"] :: "<<print->getValue()<<endl;  // 마지막 노드는 숫자만
        else
            cout<<"["<<num<<"] :: "<<print->getValue()<<endl;  // 마지막 노드가 아니면 화살표 ㅎㅎ
        print = print->next;
        num++;
    }
    return;
}
void DeleteNode(int num){
    node* cur = first;
    node* del;
    if(num<0 || count<num)
        cout<<"숫자를 잘못 입력하셨습니다."<<endl;
    else{
        for(int i=2;i<num;i++){
            cur = cur->next;
        }                                         //삭제하기 전의 노드까지 도착
        del = cur->next;                    //삭제하기 위한 노드를 del이 가리킴
        cur->next = cur->next->next; //노드 한칸 건너뛰기
        delete del;                            //건너뛰어진 노드 삭제
        count--;
    }
    return;
}

int menu(){
    int num;
    cout<<"[1]추가  [2]출력  [3]삭제  [4]찾기  [5]바꾸기  [6]종료"<<endl;
    cin>>num;
    return num;
}

void find(int val){
    node* cur = first;

    for(int i=0;i<count;i++){
        if(cur->getValue() == val)
            printf("%d번째 노드의 value는 %d입니다.\n",i+1,val);
        cur = cur->next;
    }
}

void ChangeNode(int val,int val2){
    node* cur = first;
    for(int i=1;i<val;i++){
        cur=cur->next;     //바꾸고자 하는 노드 도착
    }
    cur->setValue(val2);
    return;
}