#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년만에 코딩하려니깐 잘 안되내여--; 손코딩이라면 몇번해봤지만... 역시 머리는 컴파일러를 아직 못따라가서
시간과 함께 자잘한 문법이 생략되었던것 같내요''
므튼 이젠 연결리스트 만들러 슈슝~