본문 바로가기

app/C

싱글 링크드 리스트(학생관리편)

#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