#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 구조체 선언 */
typedef struct
{
char name[20]; // 이름을 저장할 맴버
char number[30]; // 전화번호를 저장할 맴버
}PhoneNumber;
/*사용할 함수들을 미리 선언*/
void MenuProcessor(PhoneNumber * Person[],int * i);
void Registration(PhoneNumber * Person[],int * i);
void Search(PhoneNumber * Person[],int * i);
void Deletion(PhoneNumber * Person[],int * i);
void ShowAll(PhoneNumber * Person[],int * i);
void Modification(PhoneNumber * Person[],int * i);
void ShowMenu(PhoneNumber * Person[],int * i);
/* 프로그램 실행시 최초 메인함수 호출 */
int main()
{
PhoneNumber * Person[1000]; // 최대 1000명을 저장할 구조체변수 선언
int i=0; // 구조체변수의 배열요소를 이동시킬 변수 선언
int * ptr=&i; // 다른함수에서도 접근시킬수 있도록 i를 가리키는 포인터변수 선언
ShowMenu(Person,ptr); //메뉴를 보여주는 함수 호출
return 0;
}
/* 메뉴를 보여주는 함수 */
void ShowMenu(PhoneNumber * Person[],int * i)
{
printf("*****Menu*****n");
printf("<1.Registration><2.ShowAll><3.Search>n");
printf("<4.Deletion><5.Modification><6.Exit>n");
printf("Enter_the_menu_number:");
MenuProcessor(Person,i);
}
/* 메뉴를 처리하는 함수 */
void MenuProcessor(PhoneNumber * Person[],int * i) // ShowMenu에서 전달받은 num값을 a에 대입
{
int a;
scanf("%d", &a);
if(a==1) // 1일 경우 등록처리 함수 호출
Registration(Person,i);
if(a==2) // 2일 경우 전체를 보여주는 함수 호출
ShowAll(Person,i);
if(a==3) // 3일 경우 검색 함수 호출
Search(Person,i);
if(a==4) // 4일 경우 삭제 함수 호출
Deletion(Person,i);
if(a==5) // 5일 경우 수정 함수 호출
Modification(Person,i);
if(a==6) // 6일 경우 탈출하면서 메인함수로 복귀
return ;
}
/* 자료를 등록하는 함수 */
void Registration(PhoneNumber * Person[],int * i)
{
Person[*i]=(PhoneNumber*)malloc(sizeof(PhoneNumber));
printf("Name:");
scanf("%s", Person[*i]->name); // 입력받은 이름을 i번째 자리 name맴버에 등록 (i가 가리키는 변수는 결국 메인함수의i이기 때문)
printf("Phone_number:");
scanf("%s", Person[*i]->number); // 입력받은 번호를 i번째 자리 number맴버에 등록
(*i)++; // 다음 자리에 등록될수 있도록 i의 값을 1씩 증가시킴
ShowMenu(Person,i); // 메뉴보기 함수 호출
}
/* 자료를 검색하는 함수 */
void Search (PhoneNumber * Person[],int * i)
{
int j;
char Sch[20]; // 검색할 이름을 나타내는 name맴버와 형식이 같은 변수선언
printf("Name:");
scanf("%s", &Sch); // 검색할 이름을 입력
for(j=0; j<*i; j++)
if(!strcmp(Person[j]->name,Sch)) // Sch와 j번째 자리에 있는 사람이름과 동일하면 j번째 사람의 정보를 출력
printf("Name:%s--->Phone_number:%s--->address:%lldn",Person[j]->name,Person[j]->number,&Person[j]);
ShowMenu(Person,i); // 메뉴보기 함수 호출
}
/* 자료를 제거하는 함수 */
void Deletion (PhoneNumber * Person[],int * i)
{
char Dlt[20]; // 제거할 이름을 나타내는 name맴버와 형식이 같은 변수선언
int j;
printf("Name:");
scanf("%s", &Dlt); // 제거할 이름을 입력
for(j=0; j<*i; j++)
{
if(!strcmp(Person[j]->name,Dlt)) // Delet와 j번째 자리에 있는 사람이름과 동일하면
{
free(Person[j]);
// j번째 사람의 정보에 해당되는 메모리영역을 해제
while(j<(*i)-1) // j번째 사람의정보에 j+1번째 사람의 정보를 덮어씌움, i-1번째까지 반복
{
Person[j]=Person[j+1]; //
j++;
}
(*i)--; // 한명이 지워졌으므로 자리를 한칸 앞당김
}
}
ShowMenu(Person,i);// 메뉴보기 함수 호출
}
/* 자료를 수정하는 함수 */
void Modification(PhoneNumber * Person[],int * i)
{
char Modification[20]; // 수정할 사람이름을 나타내는 name맴버와 형식이 같은 변수선언
char NewNumber[30]; //수정할 번호를 나타내는 number맴버와 형식이 같은 변수선언
int j;
printf("Name:");
scanf("%s", &Modification); // 수정할 이름을 입력
for(j=0; j<*i; j++)
{
if(!strcmp(Person[j]->name,Modification)) // Modification과 j번째 자리에 있는 사람이름과 동일하면
{
printf("New_Phone_number:");
scanf("%s", &NewNumber); // 새로운 번호를 입력
strcpy(Person[j]->number,NewNumber); // 새로운 번호를 j번째 번호에 덮어씌움
}
}
// 메뉴보기 함수 호출
ShowMenu(Person,i);
}
/* 전체보기 함수 */
void ShowAll(PhoneNumber * Person[],int * i)
{
int j;
for(j=0; j<*i; j++) // 지금까지 등록된 정보를 출력
printf("Name:%s--->Phone_number:%s--->address:%lldn",Person[j]->name,Person[j]->number,&Person[j]);
ShowMenu(Person,i); //메뉴보기 함수 호출
}
[출력결과]
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:1
Name:AAA
Phone_number:123
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:1
Name:BBB
Phone_number:123
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:1
Name:CCC
Phone_number:123
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:2
Name:AAA--->Phone_number:123--->address:6721623819807484
Name:BBB--->Phone_number:123--->address:6721623819807488
Name:CCC--->Phone_number:123--->address:6721623819807492
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:2
Name:AAA--->Phone_number:123--->address:6718686062177020
Name:BBB--->Phone_number:123--->address:6718686062177024
Name:CCC--->Phone_number:123--->address:6718686062177028
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:2
Name:AAA--->Phone_number:123--->address:6715748304546556
Name:BBB--->Phone_number:123--->address:6715748304546560
Name:CCC--->Phone_number:123--->address:6715748304546564
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:2
Name:AAA--->Phone_number:123--->address:6712810546916092
Name:BBB--->Phone_number:123--->address:6712810546916096
Name:CCC--->Phone_number:123--->address:6712810546916100
*****Menu*****
<1.Registration><2.ShowAll><3.Search>
<4.Deletion><5.Modification><6.Exit>
Enter_the_menu_number:
문제는 ShowAll 함수를 호출할때마다 adress값 (구조체변수 Person[해당값]의 주소값) 이 계속바뀝니다
뭐가문제인지 잘 모르겠네요 몇시간동안 붙잡아도 답이 안나옵니다 ㅠㅠ
고수분들 조금만 도와주세요 ...
지금 살고 있잖아요.
설
리
링크드리스트로 좀