/*
* 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;
}
'Programing > C- programing' 카테고리의 다른 글
스택 :: 가장 기본적인 형태. 배열 (0) | 2010.08.19 |
---|---|
링크드리스트 :: 추가된 리스트 원하는 위치에서 삭제, 찾기, 바꾸기 (0) | 2010.08.19 |
링크드리스트 노드 추가, 연결 (0) | 2010.08.19 |
링크드리스트 :: 간단한 기본 형태 (단방향) (0) | 2010.08.19 |
C programming :: Void형 포인터와 NULL 포인터 (3) | 2010.01.27 |