#include "stdio.h"
#include "malloc.h"
#include "string.h"
#include "stdlib.h"
#include "conio.h"
struct NODE
{
char Name[10]; //이름
int Sum; //학번
int Num; //학년
struct NODE *pnext; //노드부분
};
void View();//메뉴부
void FileLoad(); //데이터로드
void Add();//더하기~
void File(char *name,int s,int n);//처음 데이타를 로딩 하기 위한 함수
void Search(); //검색부
void Del(); //삭제부
void Print();//프린트부
void sort(struct NODE*);
void exchange(struct NODE *a,struct NODE *b);
struct NODE HEAD,TAIL ; //처음과끝
FILE *fp; //파일 포인터를 만듭니다.
main()
{
View();
}
void FileLoad()
{
char name[80];
int s;
int n;//파일에서 입력 받아올 변수
HEAD.pnext=&TAIL; //파일 구조가 머리와 꼬리로 시작(노드부분)
TAIL.pnext=NULL;
//머리와 꼬리는 데이타가 들어가지 않음 머리는 처음 데이타를 가르키고
//꼬리는 마지막 데이타가 가르키게 됨
fp=fopen("data.txt","a+"); //a+는 파일이 없으면 생성 함 읽기 쓰기 이어쓰기 기능
while(1)
{
if(fscanf(fp,"%s %d %d",name,&s,&n)==EOF)break;//파일의끝이면 탈출
File(name,s,n);//읽어온 변수들을 넘겨서 링크드리스트에 저장 합니다.
}
fclose(fp);
}
void File(char *name,int s,int n)
{
struct NODE *p= (struct NODE*)malloc(sizeof(struct NODE)); //읽어들어온만큼 메모리를 할당해주며 P로포인트정함.
struct NODE *k;
k=HEAD.pnext;
HEAD.pnext = p;
p->pnext=k; //이부분은 Add()함수와 동일함
strcpy(p->Name,name);
p->Sum=s;
p->Num=n; //입력받은 데이타를 추가
}
void Add()
{
char INname[10];
int INSum=0;
int INNum=0;
struct NODE *p= (struct NODE*)malloc(sizeof(struct NODE));
struct NODE *k;
struct NODE *r;
k=HEAD.pnext; //데이타의처음 부분을 저장
HEAD.pnext = p; //새로은 데이타를 추가시킴
p->pnext=k; //추가된 데이타가 바로전 맨앞에 있던 데이타를 가르킴
//데이타가 뒷쪽에 추가 되는게 아니라 앞쪽으로 추가됨
printf("\n이름입력: ");
scanf("%s",INname);
printf("\n학번입력: ");
scanf("%d",&INSum);
printf("\n학년입력: ");
scanf("%d",&INNum);
strcpy(p->Name,INname);
p->Sum=INSum;
p->Num=INNum;
fp=fopen("data.txt","w");//데이타를 추가한후 전체 데이타를 파일에 저장 (덮어씀)
r=HEAD.pnext;
while(r != &TAIL)
{
fprintf(fp,"%s %d %d\n",r->Name,r->Sum,r->Num);//파일에 저장
r=r->pnext;//다음 포인터로 이동 포인터를옮겨가며 차례대로 저장.
}
fclose(fp);
}
void Search() //학번으로 검색.
{
char SName[50];
struct NODE *p;
p=HEAD.pnext;
printf("찾을이름: ");
scanf("%s",&SName);
while(p != &TAIL)
{
if(strcmp(p->Name , SName)==0)
{
printf("%s %d %d\n",p->Name,p->Sum, p->Num);
break;
}
else
{
p=p->pnext;
}
}
}
void Del()
{
char Dname[50];
struct NODE *p;
struct NODE *k;
struct NODE *r;
k = &HEAD;
p = HEAD.pnext;
printf("\n지울이름: ");
scanf("%s",Dname);
while(p != &TAIL)
{
if(strcmp(p->Name,Dname)==0)//같은 이름이면
{
k->pnext = p->pnext; //지울 데이타가 가르키는부분을 바로전 데이타로 저장
//포인터를건너띄우고.
//메모리를 노아주면..삭제.
free(p);
printf("삭제하였습니다.");
break;
}
else
{
k = p;//바로전 데이타 저장
p = p->pnext;
}
}
fp=fopen("data.txt","w");//데이타 삭제가 된후 모든 데이타를 파일에 저장(덮어씀)
r=HEAD.pnext;
while(r != &TAIL)//데이터의 처음부터 저장..
{
fprintf(fp,"%s %d %d\n",r->Name,r->Sum,r->Num);
r=r->pnext;
}
fclose(fp);
}
void Print()
{
int a=0;
struct NODE *p;
p=HEAD.pnext;
printf("\n");
printf("이름\t 학번\t 학년\n");
sort(p); //정렬 한후 출력
while(p != &TAIL)
{
printf("%s\t %d\t %d \n",p->Name,p->Sum, p->Num);
a++;
p=p->pnext;
}
printf("%d명의 정보가 있습니다.\n\n", a);
}
void View()
{
int ch;
FileLoad();
while(1)
{
system("cls");
printf("\n 학생 관리 프로그램 \n\n");
printf("==================================\n");
printf("======== 1. 학 생 목 록 =======\n");
printf("======== 2. 학 생 추 가 =======\n");
printf("======== 3. 학 생 검 색 =======\n");
printf("======== 4. 학 생 삭 제 =======\n");
printf("======== 0. 프로그램 종료 =======\n");
printf("==================================\n");
printf("번호를누르세요--->");
ch=getch();
switch(ch)
{
case '1': Print(); break;
case '2': Add(); break;
case '3': Search(); break;
case '4': Del(); break;
case '0': printf("\n종료합니다.\n");
exit(0);
}
printf("\n\n==================================\n");
printf("=========아무키나눌러주세요=======\n");
printf("=====================================");
getch();
}
}
void sort(struct NODE *p)
{
struct NODE *q;
struct NODE *r;
//버블 정렬 사용
for(q=p; q->pnext!=NULL; q=q->pnext)
{
for(r=p; r->pnext->pnext!=NULL; r=r->pnext)
{
if ( r->Sum > r->pnext->Sum )
{
exchange(r, r->pnext);
}
}
}
}
void exchange(struct NODE* a,struct NODE* b)
{//포인터를 교환하는게 아니라 값을 교환
struct NODE temp;
strcpy(temp.Name, a->Name);
temp.Num= a->Num;
temp.Sum= a->Sum;
strcpy(a->Name, b->Name);
a->Num= b->Num;
a->Sum= b->Sum;
strcpy(b->Name, temp.Name);
b->Num= temp.Num;
b->Sum= temp.Sum;
}
겨우..완성하긴했는데;;-0-;;
포인터부분이이해가잘않간다..~~
포인터책만.몇주쨰보는데이러니원;;=-=(너무대충봐~)
담주까지.더블완성해야되는데~~힘드네~
'app > C' 카테고리의 다른 글
ARtool-kit 셋팅!! (0) | 2008.12.17 |
---|---|
openCV 셋팅!! (0) | 2008.12.15 |
문자열 처리 , strtok() (2) | 2008.12.14 |
gets() 와 scanf()의 차이점 소스 (0) | 2007.09.10 |
자료의 입출력 (0) | 2007.08.22 |