#include "stdio.h" /* 표준 입출력 라이브러리 */
#include "stdlib.h" /* 표준 라이브러리 */
#include "string.h" /* 문자열 라이브러리 */
#define HEADER 1 "-학생-\n"
# define header 2 "| number | name | comp | math | eng | sum | ave | mici | \ n"
# defineheader 3 "|-|-|-|-|-|-|-|-|" 을 참조하십시오
# define format "|%-10s |%-15s |% 4d |% 4d |% 4d |% 4d |%
# 데이터 정의 p-> Data.num, p-> Data.name, p-> Data.egrade, p-> Data.mgrade, p-> Data.cgrade, p-> Data.total, p-> Data.ave, p-> Data.mingci
# 정의 끝 "-\n"
Intsaveflag = 0; /* 플래그 변수를 저장해야 합니까 */
/* 학생 관련 데이터 구조 정의 */
Typedef 구조 student /* 는 student*/
{
Char num: ");
Scanf("%d ",& 선택);
If (선택 = =1)/* 학번별로 조회 */
{
Stringinput(searchinput, 10, "기존 학번 입력:");
P=Locate(l, searchinput, "num"); /* l 에서 학번이 searchinput value 인 노드를 찾아 해당 노드에 대한 포인터를 반환합니다. */
If(p) /* if p! =NULL*/
{
Printheader ();
Printdata (p);
Printf (end);
Printf ("돌아가려면 아무 키나 누르십시오");
Getchar ();
}
기타
Nofind ();
Getchar ();
}
Else if(select==2) /* 이름별 조회 */
{
Stringinput(searchinput, 15, "기존 학생 이름 입력:");
P=Locate(l, searchinput, "name");
다음 경우 (p)
{
Printheader ();
Printdata (p);
Printf (end);
Printf ("돌아가려면 아무 키나 누르십시오");
Getchar ();
}
기타
Nofind ();
Getchar ();
}
기타
오류 ();
Getchar ();
}
/* 학생 레코드 삭제: 먼저 학생 레코드가 저장된 노드를 찾은 다음 노드를 삭제합니다 */
유효하지 않은 삭제 (링크 l)
{
Int sel
노드 *p, * r;;
Char find mess: ");
Scanf("%d ",& ampsel);
If(sel== 1)
{
Stringinput(findmess, 10, "기존 학번 입력:");
P = 위치 (l, findmess, "num");
If(p) /*p! =NULL*/
{
R = l;;
While (r->; 다음! =p)
R = r-& gt;; 다음으로,
R-> Next = p-& gt;; 다음으로, /* 연결된 목록에서 p 가 가리키는 노드 제거 */
무료 (p); /* 메모리 공간 확보 */
Printf(" \ n = = = = =>;; 삭제에 성공했습니다! \ n ");
Getchar ();
저장 플래그 =1;
}
기타
Nofind ();
Getchar ();
}
Else if(sel==2) /* 먼저 레코드가 있는 노드를 이름별로 조회합니다 */
{
Stringinput(findmess, 15, "기존 학생 이름 입력");
P=Locate(l, findmess, "name");
다음 경우 (p)
{
R = l;;
While (r->; 다음! =p)
R = r-& gt;; 다음으로,
R-> Next = p-& gt;; 다음으로,
무료 (p);
Printf(" \ n = = = = =>;; 삭제에 성공했습니다! \ n ");
Getchar ();
저장 플래그 =1;
}
기타
Nofind ();
Getchar ();
}
기타
오류 ();
Getchar ();
}
/* 학생 기록을 수정하다. 먼저 입력한 학번을 기준으로 레코드를 조회한 다음 학번이 아닌 값을 수정하라는 메시지를 표시합니다. 학호는 수정할 수 없습니다 */
유효하지 않은 수정 (링크 l)
{
노드 * p;
Char find mess [20];
만약 (! L-> 다음)
{
Printf(" \ n = = = = =>;; 학생 기록이 없습니다! \ n ");
Getchar ();
반환;
}
Printf ("학생 레코더 수정");
Disp (l);
Stringinput(findmess, 10, "기존 학번 입력:"); /* 학번 입력 및 확인 */
P = 위치 (l, findmess, "num"); /* 이 노드 조회 */
If(p) /* if p! =NULL, 노드를 찾았음을 나타냅니다 */
{
Printf ("번호: %s, \n", p-> Data.num);
Printf("Name:%s, ",p-> Data.name);
Stringinput (p-> Data.name, 15, "새 이름 입력:");
Printf("C 언어 점수: %d, ",p-> Data.c grade);
P->; Data.cgrade=numberinput("C 언어 점수 [0-100]:);
Printf ("수학 점수: %d,", p-> Data.m grade);
P->; Data.mgrade=numberinput ("수학 점수 [0-100]:);
Printf ("영어 성적: %d,", p-> Data.egrade);
P->; Data.egrade=numberinput ("영어 성적 [0-100]:);
P->; Data.total = p-> Data.e grade+p-> Data.c grade+p-> Data.m grade;
P->; Data.ave = (float) (p-> Data.total/3);
P->; Data.mingci = 0;
Printf(" \ n = = = = =>;; 수정 성공! \ n ");
Disp (l);
저장 플래그 =1;
}
기타
Nofind ();
Getchar ();
}
/* 레코드 삽입: 학번을 기준으로 삽입할 노드의 위치를 조회한 다음 학번 뒤에 새 노드를 삽입합니다. */
빈 플러그인 (링크 l)
{
링크 p, v, newinfo/*p 는 삽입 위치, newinfo 는 새로 삽입된 레코드 */
Char ch, num[ 10], s [10]; /*s[] 삽입점 위치 앞의 학번을 저장하고, num[] 은 입력한 새 레코드의 학번을 저장합니다 */
Intflag = 0;
V = l-& gt;; 다음으로,
시스템 ("cls");
Disp (l);
While( 1)
{stringinput(s, 10, "숫자 뒤에 삽입 위치 입력:");
Flag = 0;; V = l-& gt;; 다음으로,
While(v) /* 학번 존재 여부 조회, flag= 1 학번 존재 */
{
If (strcmp (v-> Data.num, s) = = 0) {flag =1; 깨뜨리다 }
V = v-& gt;; 다음으로,
}
If(flag== 1)
깨뜨리다 /* 학생 번호가 있는 경우 삽입하기 전에 새 레코드를 입력하십시오 */
기타
{getchar ();
Printf(" \ n = = = = =>;; 번호 %s 이 (가) 존재하지 않습니다. 다시 시도해 보시겠습니까? (y/n): ",s);
Scanf("%c ",& ampch);
If(ch=='y'||ch=='Y')
{계속; }
기타
{반환; }
}
}
/* 다음 새 레코드의 입력 작업은 Add () */ 와 동일합니다
Stringinput(num, 10, "새 학번 입력:");
V = l-& gt;; 다음으로,
While (5)
{
If (strcmp (v-> Data.num, num)= 0)
{
Printf ("= = = = = = = = > 죄송합니다. 새 번호:' %s' 이 (가) 이미 존재합니다! \n ",번호);
Printheader ();
Print data (v) :
Printf ("\ n");
Getchar ();
반환;
}
V = v-& gt;; 다음으로,
}
New info = (node *) malloc (sizeof (node));
만약 (! Newinfo) 를 참조하십시오
{
Printf("\n 메모리 할당 실패 "); /* 요청을받지 못한 경우 알림 메시지 인쇄 */
반환; /* 주 인터페이스로 돌아가기 */
}
Strcpy (newinfo-> Data.num, num);
Stringinput (new info-> Data.name, 15, "이름:");
Newinfo-& gt;; Data.cgrade=numberinput("C 언어 점수 [0-100]:);
Newinfo-& gt;; Data.mgrade=numberinput ("수학 점수 [0-100]:);
Newinfo-& gt;; Data.egrade=numberinput ("영어 성적 [0-100]:);
Newinfo-& gt;; Data.total = newinfo-> Data.e grade+newinfo-> Data.c grade+newinfo-> Data.m grade;
Newinfo-& gt;; Data.ave = (float) (newinfo-> Data.total/3);
Newinfo-& gt;; Data.mingci = 0;
Newinfo-& gt;; Next = NULL
저장 플래그 =1; /* 전역 변수는 main () 에서 판단됩니다. 1 인 경우 */
/* l 에 있는 헤드 노드의 다음 노드가 실제로 학생 기록을 저장하므로 p 에 포인터를 지정합니다. */
P = l-& gt;; 다음으로,
While( 1)
{
If (strcmp (p-> Data.num, s)==0) /* 연결된 테이블에 노드 삽입 */
{
Newinfo-& gt;; Next = p-& gt;; 다음으로,
P->; Next = newinfo
깨뜨리다
}
P = p-& gt;; 다음으로,
}
Disp (l);
Printf ("\ n \ n");
Getchar ();
}
/* 통계 클래스 및 단일 섹션 총점, 각 섹션에 실패한 인원 수 */
허공동지 (순환선 l)
{
노드 *pm, *pe, *pc, * pt/* 가장 높은 점수를 받은 노드 */
노드 * r = l-> 다음으로,
Int countc=0, countm=0, counte = 0;; /* 3 학년 불합격자 저장 */
만약 (! R)
{
Printf(" \ n = = = = =>;; 학생 기록이 아닙니다! \ n ");
Getchar ();
반환;
}
Disp (l);
Pm = PE = PC = pt = r;;
While(r)
{
If (r-> Data.c grade < 60) 개수 c++;
If (r-> Data.m grade < 60) count m++;
If (r-> Data.e grade < 60) count e++;
If (r-> Data.c grade > = PC->; Data.c grade) PC = r;
If (r-> Data.m grade > = pm->; Data.m grade) pm = r;
If (r-> Data.e grade > = PE-& gt;; Data.egrade) PE = r;
If (r-> Data.total & gt= pt-& gt;; Data.total) pt = r;
R = r-& gt;; 다음으로,
}
Printf("\n-중복 결과-\ n ");
Printf("C 언어 & lt60:%d (임의) \n ",countc);
Printf(" Math & lt;; 60:%d (임의) \n ",countm);
Printf ("영어 & lt60:%d (임의) \n", counte);
Printf ("-\ n");
Printf ("총점이 가장 높은 학생 이름: %s 총점: %d\n", pt-& gt;; Data.name, pt-& gt;; Data.total);
Printf ("영어 성적이 가장 높은 학생 이름: %s 총 성적: %d\n", PE-& gt;; Data.name, PE-& gt;; Data.egrade);
Printf ("수학 성적이 가장 높은 학생 이름: %s 총 성적: %d\n", pm-& gt;; Data.name, pm-& gt;; Data.m grade);
Printf(" C 점수가 가장 높은 학생 이름: %s 총 점수: %d\n ",PC-& gt;; Data.name, PC-& gt;; Data.c grade);
Printf(" \ n \ n 아무 키나 눌러 ");
Getchar ();
}
/* 삽입 정렬 방법을 사용하여 단일 연결된 목록을 총점 필드별로 내림차순으로, 높음에서 낮음까지 */
잘못된 정렬 (링크 l)
{
링크 ll;
노드 *p, *rr, * s;;
Int I = 0;;
만약 (l-> Next==NULL)
{system ("cls");
Printf(" \ n = = = = =>;; 학생 기록이 아닙니다! \ n ");
Getchar ();
반환;
}
Ll=(Node*)malloc(sizeof(Node)) 입니다. /* 새 노드를 만드는 데 사용 */
만약 (! Ll) 을 참조하십시오
{
Printf("\n 메모리 할당 실패 "); /* 요청을받지 못한 경우 알림 메시지 인쇄 */
반환; /* 주 인터페이스로 돌아가기 */
}
Ll-& gt;; Next = NULL
Disp (l); /* 정렬 전에 모든 학생 기록 표시 */
P = l-& gt;; 다음으로,
While(p) /*p! =NULL*/
{
S = (node *) malloc (sizeof (node)); /* 새 노드는 원래 연결된 목록에서 가져온 노드 정보를 저장하는 데 사용됩니다. */
만약 (! S) /*s==NULL*/
{
Printf("\n 메모리 할당 실패 "); /* 요청을받지 못한 경우 알림 메시지 인쇄 */
반환; /* 주 인터페이스로 돌아가기 */
}
S-> Data = p-& gt;; 데이터; /* 데이터 필드 채우기 */
S-> Next = NULL/* 포인터 필드가 비어 있음 */
Rr = ll
/*rr 링크리스트는 단일 노드를 삽입한 후 정렬을 유지하는 링크리스트이고, ll 은 이 링크리스트의 헤드 포인터이며, 매번 처음부터 삽입 위치를 검색합니다. */
While (RR->; 다음! = NULL & amp& ampRR-& gt;; 다음-> Data.total & gt = p->; 데이터. 합계)
{RR = RR-& gt;; 다음으로, }/* 포인터는 전체 점수가 P */ 가 가리키는 전체 노드 점수보다 작은 노드 위치로 이동합니다
If (RR-> Next==NUll)/* 새 연결된 목록 ll 에 있는 모든 노드의 총 점수가 p->; Data.total 이 크면 p 가 가리키는 노드를 연결된 테이블의 끝에 추가합니다 */
RR-& gt;; Next = s;;
Else /* 그렇지 않으면 총점 필드가 첫 번째 노드보다 작은 노드 앞에 노드 */
{
S-> Next = RR-& gt;; 다음으로,
RR-& gt;; Next = s;;
}
P = p-& gt;; 다음으로, /* 원래 연결된 목록의 포인터가 한 노드 아래로 이동합니다 */
}
L-> Next = ll-& gt;; 다음으로, /* 정렬된 연결된 목록의 헤더 포인터는 /*ll */ 에 저장됩니다
P = l-& gt;; 다음으로, /* 정렬 된 헤드 포인터는 p 에 할당되어 순위를 채울 준비가되었습니다 */
그리고 (p! =NULL) /* p 가 비어 있지 않은 경우 다음을 수행합니다 */
{
I++;+; /* 노드 일련 번호 */
P->; Data.mingci = I; /* 할당 등급 */
P = p-& gt;; 다음으로, /* 포인터가 뒤로 이동합니다 */
}
Disp (l);
저장 플래그 =1;
Printf(" \ n = = = = =>;; 정렬 완료! \ n ");
}
/* 데이터를 저장합니다. 사용자가 특별히 이 작업을 하지 않고 데이터를 수정한 경우 시스템을 종료할 때 데이터를 저장하라는 메시지가 표시됩니다 */
유효하지 않은 저장 (링크 l)
{
FILE * FP
노드 * p;
Intcount = 0;
Fp=fopen("c:\\student ","WB "); /* 쓰기 전용으로 이진 파일 열기 */
If(fp==NULL) /* 파일을 열 수 없음 */
{
Printf(" \ n = = = = =>;; 파일 열기 오류! \ n ");
Getchar ();
반환;
}
P = l-& gt;; 다음으로,
While(p)
{
If (fwrite (p, sizeof (node), 1, FP) = = 1)/* 한 번에 하나의 레코드나 노드 정보를 파일에 씁니다. * *
{
P = p-& gt;; 다음으로,
Count++;+;
}
기타
{
깨뜨리다
}
}
If(count & gt;; 0)
{
Getchar ();
Printf ("\ n \ n \ n \ n \ n = = = = = = = > 파일 저장이 완료되었습니다. 저장된 총 레코드 수는 %d\n, 개수);
Getchar ();
저장 플래그 = 0;
}
기타
{
Printf ("현재 링크가 비어 있습니다. 학생 기록이 저장되지 않았습니다! \ n ");
Getchar ();
}
Fclose (FP); /* 파일 닫기 */
}
Void main ()
{
링크 l; /* 연결된 목록 정의 */
파일 * FP/* 파일 포인터 */
Int select/* 선택 결과 변수 저장 */
Char ch/* Save (y, y, n, N)*/
Intcount = 0; /* 저장된 파일의 레코드 (또는 노드) 수 */
노드 *p, * r;; /* 레코드 포인터 변수 정의 */
L=(Node*)malloc(sizeof(Node)) 입니다.
만약 (! L)
{
Printf("\n 메모리 할당 실패 "); /* 요청을받지 못한 경우 알림 메시지 인쇄 */
반환; /* 주 인터페이스로 돌아가기 */
}
L-> Next = NULL
R = l;;
Fp=fopen("C:\\student ","a b+"); /* 이진 파일을 추가로 열어 읽고 쓸 수 있습니다. 파일이 없으면 */
If(fp==NULL)
{
Printf(" \ n = = = = =>;; 파일을 열 수 없습니다! \ n ");
종료 (0);
}
그리고 (! Feof(fp))
{
P= (노드 *)malloc(sizeof (노드));
만약 (! P)
{
Printf ("메모리 malloc 실패! \ n "); /* 신청 성공 없음 */
종료 (0); /* 종료 */
}
If (fread (p, sizeof (node), 1, FP) = = 1)/* 파일에서 한 번에 한 학생 레코드 읽기 */
{
P->; Next = NULL
R-> Next = p;;
R = p;; /* r 포인터가 한 단계 뒤로 이동하고 r 이 L- > 다음-> 를 가리킵니다 다음-> ...... r-> NULL*/
Count++;+;
}
}
Fclose (FP); /* 파일 닫기 */
Printf(" \ n = = = = =>;; 파일 열기가 성공했습니다. 총 레코드 수는 %d.\n ",개수);
메뉴 ();
While( 1)
{
메뉴 ();
P = r;;
Printf("\n 선택 사항을 입력하십시오 (0 ~ 9): "); /* 프롬프트 정보 표시 */
Scanf("%d ",& 선택);
If (선택 = = 0)
{
If(saveflag== 1) /* 체인 테이블의 데이터가 저장되지 않고 수정된 경우 이 플래그는 1*/
{getchar ();
Printf(" \ n = = = = =>;; 수정된 레코드를 파일에 저장하시겠습니까? (예/아니오):;
Scanf("%c ",& ampch);
If(ch=='y'||ch=='Y')
저장 (l);
}
Printf ("= = = = = = = = > 유용해 주셔서 감사합니다! );
Getchar ();
깨뜨리다
}
스위치 (선택)
{
사례 1: 추가 (l); 깨뜨리다 /* 학생 레코드 추가 */
사례 2: 델 (l); 깨뜨리다 /* 학생 기록 삭제 */
사례 3: 코란 (왼쪽); 깨뜨리다 /* 학생 기록 조회 */
사례 4: 수정 (l); 깨뜨리다 /* 학생 기록 수정 */
사례 5: 삽입 (l); 깨뜨리다 /* 학생 기록 삽입 */
사례 6: 동지 (l); 깨뜨리다 /* 학생 기록 통계 */
사례 7: 정렬 (l); 깨뜨리다 /* 학생 기록 정렬 */
사례 8: 저장 (l); 깨뜨리다 /* 학생 기록 저장 */
사례 9: disp (l); 깨뜨리다 /* 학생 기록 표시 */
기본값: 오류 (); Getchar (); 깨뜨리다 /* 키가 잘못되었습니다. 0-9*/
}
}
}