프로그래밍[Univ]/데이터구조

[리스트]배열 리스트를 구연해보았습니다.(각 단계 해설 有) 5/23

Cloud Travel 2011. 5. 23. 12:53

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct nodetype{ // 저장할 데이터 자료형을 구조체로 묶습니다.
 int data;            // 간단한 프로그램 작성을 위해 정수 데이터 하나만 넣었습니다.
}node;

typedef struct nodelist{  // List의 형태를 구조체로 묶습니다.
 node *ptr_node;  // ptr_node는 데이터 자료형을 사용자가 원하는 크기의 배열로 만들어지게 point로 작성했습니다.
 int max;         // max는 List에서 최대로 저장할수 있는 자료의 양을 나타냅니다.
 int count;       // count는 List에 저장된 자료의 양을 나타냅니다.
}Alist;

Alist *makelist(int max){  // List를 생성하는 함수입니다.
 Alist *returnlist;  // List생상을 하여 반환해 줄 list 변수를 정의합니다.

 if ( max > 0 ){ // max값이 사용하기에 적잘한 값인지를 판단합니다.
  returnlist = (Alist *)malloc(sizeof(Alist)); // List를 생성합니다.
  if ( returnlist != NULL ) { // 동적할당이 잘됬는지 확인합니다.
   returnlist -> max = max;
   returnlist -> count = 0;
   returnlist -> ptr_node = (node *)malloc(sizeof(node)*max);
   // 각각에 맞는 변수를 넣고 ptr_node를 동적할당합니다. node의 배열이 생성되는 겁니다.
   if(returnlist -> ptr_node == NULL){ // 동적할당이 잘됬는지 확인합니다.
    printf("Error\n");
    return 0;
   }else{
    memset(returnlist -> ptr_node, 0, sizeof(node)*max); // 각 배열의 데이터를 0으로 변환합니다.
   }
  }else{
   printf("Error\n");
   return 0;
  }
 }else{
  printf("Error value of max\n");
  return 0;
 }
 return returnlist;
}

void Add(Alist *list,int p,node d){  // 자료를 추가하는 함수입니다.
 if ( (list -> max < p) || ( p < 0 ) || (list -> count < p) ){  // 위치의 타당상을 검사합니다.
  printf("Error value of position\n");
  return ;
 }else if( list -> count == list -> max ){ // 저장 데이터 공간이 충분한지 여부를 검사합니다.
  printf("Full Data!! You don't input data!!\n");
 }else{
  int temp;
  for ( temp = list -> count-1 ; temp >= p ; temp-- ){  // 데이터 삽입을 위해 밀어내기로 자리를 만들어줍니다.
   list -> ptr_node[temp+1] = list -> ptr_node[temp]; 
  }
  list -> ptr_node[p] = d; // 데이터를 삽입합니다.
  list -> count++;  // 저장된 자료의 개수를 한 단계 올려줍니다.
 }
 return ;
}

void Del(Alist *list, int p){ // 자료를 지우는 함수입니다.
 if ( list -> count - 1 < p || p < 0 ){ // 위치의 타당성을 검사합니다.
  printf("Error value of position\n");
 }else{
  int temp;
  for ( temp = p ; temp <= list -> count ; temp++ ){ // 데이터를 지우고, 연속적인 데이터가 오게 밀어내기를 합니다.
   list -> ptr_node[temp] = list -> ptr_node[temp+1]; 
  }
  list -> ptr_node[list->count-1].data = 0; // 마지막으로 들어있던 값에 0을 넣습니다.
  list -> count--; // 저장된 자료의 개수를 한 단계 줄입니다.
 }
}

void Seek(Alist *list,int p){ // 해당 index에 해당하는 자료를 검색합니다.
 printf("%d번째 data : %d\n",p,list -> ptr_node[p].data);
 // 솔직히 배열에서는 함수로 따로 만드는게 필요할까라는 생각이듭니다.
 return ;
}

void display(Alist *list){  // 현재 저장된 모든 자료 값을 보여줍니다.
 int i;
 for ( i = 0 ; i < list -> count ; i++ ){
  printf("%d번째 자료 : %d\n", i, list -> ptr_node[i]);
 }
 return ;
}

//메인 함수는 제가 열심이 꾸며보았습니다''!!

int main(){
 int max;
 Alist *Arraylist = NULL;
 printf("최대  저장 개수 : ");
 scanf("%d",&max);
 printf("%d개를 저장할 수 있는 배열 리스트를 생성합니다.\nIndex는 0부터입니다.",max);
 Arraylist = makelist(max);
 
 while(1){
  int select;
  int position;
  node data_node;
  
  printf("\n\n최대 저장개수 : %d\t현재 저장개수 : %d\n",Arraylist -> max, Arraylist -> count);
  printf("기능을 선택해주십시요.\n");
  printf("1.자료저장\t2.자료삭제\t3.자료검색\t4.전체자료보기\t5.종류\n");
  scanf("%d",&select);
  switch(select){
   case 1: 
    printf("저장 위치 : ");
    scanf("%d",&position);
    printf("저장 자료 : ");
    scanf("%d",&data_node.data);
    Add(Arraylist,position,data_node);
    break;
   case 2:
    printf("삭제할 자료 위치 : ");
    scanf("%d",&position);
    Del(Arraylist,position);
    break;
   case 3:
    printf("찾을 자료 위치 : ");
    scanf("%d",&position);
    Seek(Arraylist,position);
    break;
   case 4:
    display(Arraylist);
    break;
   case 5:  // 종료시 데이터메모리를 해제 해주는 것을 잊지맙시다~
    free(Arraylist -> ptr_node);
    free(Arraylist);
    return ;
   default:
    printf("You don't press colect number");
  }
 }
}
------------------------------------------------------------------------------------------------------
위에 저장되는 데이터 구조형식을 도식화하면...


이렇게 되지 않을가..?

2년만에 코딩하려니깐 잘 안되내여--; 손코딩이라면 몇번해봤지만... 역시 머리는 컴파일러를 아직 못따라가서

시간과 함께 자잘한 문법이 생략되었던것 같내요''

므튼 이젠 연결리스트 만들러 슈슝~