728x90
해당 기능들을 본인의 취향대로 구현하시오 단 연결리스트를 이용하여 구현합니다.
1. 헤더 파일, 구조체, 전역변수
헤더파일의 경우 기본적으로 입출력을위해 stdio 헤더파일과 메모리할당을 위해 stdlib.h
그리고 문자열비교strcmp() 함수를 이용하기위해 string.h을 포함해주었다.
구조체는 위 문제와는 다르게 blood의 크기를 20으로 수정하였습니다.
전역변수로는 struct node* head( =NODE *head ) 를 정의하였다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node{
struct node* next;
int year;
char id[20];
char dept[20];
char name[20];
char blood[20];
float height;
float weight;
}NODE;
NODE *head = NULL;
main 함수
int main(void)
{
// 리스트의 가장 처음 노드를 가르키는 포인터
int menu = 0;
while(menu!=5){
printf("학생 정리 관리 프로그램 \n --------------------------------------------------------------------------------\n1. 학생 정보 입력\n2. 학생 정보 삭제\n3. 학생 검색\n4. 학생 정보 출력\n5. 프로그램 종료\n--------------------------------------------------------------------------------\n메뉴 선택 : ");
scanf("%d",&menu);
switch(menu){
case 1:
addNode(&head); //학생정보 추가
break;
case 2:
del_node(); //모든학생의 데이터 삭제
break;
case 3:
search_node(); //학생의 생년월일을 입력하고 해당학생을 찾아 출력
break;
case 4:
print_node(); //모든학생정보를 출력
break;
case 5:
free_node(); //종료
break;
}
}
return 0;
}
addNode()
//현재 리스트의 맨 뒤에 노드를 추가해주는 함수
void addNode(NODE **head)
{
// 전달받은 값을 저장하는 새로운 노드를 생성한다.
NODE *newNode = createNode();
// 헤드에 아무것도 없을 경우
// 즉, 현재 노드가 하나도 없을 경우
if(*head == NULL)
{
// 헤드에 생성한 노드를 연결
*head = newNode;
}
else
{
NODE *temp = *head;
// 마지막 노드를 찾는 루프
while(temp->next != NULL)
{
temp = temp->next;
}
// 마지막 노드일 경우 새로 생성한 노드 연결
temp->next = newNode;
}
}
del_node()
void del_node(){
NODE * curr = head;
char yesorno[20];
printf("정말 모든학생의 정보를 삭제하시겠습니까? (yes or no) : ");
scanf("%s",yesorno);
if(strcmp(yesorno,"yes") ==0 || strcmp(yesorno,"YES") ==0 ) //yesorno가 yes이거나 YES일떄 strcmp비교를통해 같으면 0이 반환 됨
{
head = NULL;
}
}
search_node()
void search_node(){
int check_year;
int n_count,check = 0;
printf("찾을 학생의 생년월일 입력하세요ex)20000321 : ");
scanf("%d",&check_year);
NODE *cur = head;
while(cur != NULL){ //head파일의 데이터부터 시작하여
if(cur->year == check_year) //생년월일이 일치할경우 출력
{
printf("id : %s | ",cur->id);
printf("dept : %s | ",cur->dept);
printf("year : %d | ",cur->year);
printf("name : %s | ",cur->name);
printf("height : %f | ",cur->height);
printf("weight : %f | ",cur->weight);
printf("blood : %s \n\n",cur->blood);
}
cur= cur->next; //출력후or스킵후 cur는 cur의next주소를 가리킴
}
}
free_node()
void free_node(){
NODE * curr = head;
while(curr != NULL){
free(curr);
curr = curr->next;
}
}
print_node()
void print_node(){
NODE * curr = head;
printf("\n+++++ 학생 정보 +++++\n");
while(curr != NULL){ //curr는 head의 데이터부터 시작하여 한칸씩(여기서 한칸이란 NODE한칸)이동
printf("id : %s | ",curr->id);
printf("dept : %s | ",curr->dept);
printf("year : %d | ",curr->year);
printf("name : %s | ",curr->name);
printf("height : %f | ",curr->height);
printf("weight : %f | ",curr->weight);
printf("blood : %s | ",curr->blood);
printf("NODE(p) : %p\n",curr);
curr = curr->next; //curr은 curr의 next(다음노드의 주소)를 저장한다
}
printf("+++++ 학생 정보 +++++\n\n");
}
전체코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node{
struct node* next;
int year;
char id[20];
char dept[20];
char name[20];
char blood[20];
float height;
float weight;
}NODE;
NODE *head = NULL;
int people_count = 0;
//전달받은 데이터를 저장하는 하나의 노드를 생성하는 함수
NODE* createNode()
{
people_count++;
int n_year;
char n_id[20],n_dept[20],n_name[20],n_blood[20];
float n_height,n_weight;
NODE *temp = (NODE*)malloc(sizeof(NODE));
printf("id : ");
scanf("%s",n_id);
printf("dept : ");
scanf("%s",n_dept);
printf("year : ");
scanf("%d",&n_year);
printf("name : ");
scanf("%s",n_name);
printf("height : ");
scanf("%f",&n_height);
printf("weight : ");
scanf("%f",&n_weight);
printf("blood : ");
scanf("%s",n_blood);
temp->year = n_year;
temp->height= n_height;
temp->weight = n_weight;
for(int i =0; i<20; i++){
temp->id[i] = n_id[i];
temp->dept[i] = n_dept[i];
temp->name[i] = n_name[i];
temp->blood[i] = n_blood[i];
}
temp->next = NULL;
return temp;
}
//현재 리스트의 맨 뒤에 노드를 추가해주는 함수
void addNode(NODE **head)
{
// 전달받은 값을 저장하는 새로운 노드를 생성한다.
NODE *newNode = createNode();
// 헤드에 아무것도 없을 경우
// 즉, 현재 노드가 하나도 없을 경우
if(*head == NULL)
{
// 헤드에 생성한 노드를 연결
*head = newNode;
}
else
{
NODE *temp = *head;
// 마지막 노드를 찾는 루프
while(temp->next != NULL)
{
temp = temp->next;
}
// 마지막 노드일 경우 새로 생성한 노드 연결
temp->next = newNode;
}
}
void print_node(){
NODE * curr = head;
printf("\n+++++ 학생 정보 +++++\n");
while(curr != NULL){
printf("id : %s | ",curr->id);
printf("dept : %s | ",curr->dept);
printf("year : %d | ",curr->year);
printf("name : %s | ",curr->name);
printf("height : %f | ",curr->height);
printf("weight : %f | ",curr->weight);
printf("blood : %s | ",curr->blood);
printf("NODE(p) : %p\n",curr);
curr = curr->next;
}
printf("+++++ 학생 정보 +++++\n\n");
}
void free_node(){
NODE * curr = head;
while(curr != NULL){
free(curr);
curr = curr->next;
}
}
void del_node(){
NODE * curr = head;
char yesorno[20];
printf("정말 모든학생의 정보를 삭제하시겠습니까? (yes or no) : ");
scanf("%s",yesorno);
if(strcmp(yesorno,"yes") ==0 || strcmp(yesorno,"YES") ==0 ) //yesorno가 yes이거나 YES일떄 strcmp비교를통해 같으면 0이 반환 됨
{
head = NULL;
}
}
void search_node(){
int check_year;
int n_count,check = 0;
printf("찾을 학생의 생년월일 입력하세요ex)20000321 : ");
scanf("%d",&check_year);
NODE *cur = head;
while(cur != NULL){
if(cur->year == check_year)
{
printf("id : %s | ",cur->id);
printf("dept : %s | ",cur->dept);
printf("year : %d | ",cur->year);
printf("name : %s | ",cur->name);
printf("height : %f | ",cur->height);
printf("weight : %f | ",cur->weight);
printf("blood : %s \n\n",cur->blood);
}
cur= cur->next;
}
}
int main(void)
{
// 리스트의 가장 처음 노드를 가르키는 포인터
int menu = 0;
while(menu!=5){
printf("학생 정리 관리 프로그램 \n --------------------------------------------------------------------------------\n1. 학생 정보 입력\n2. 학생 정보 삭제\n3. 학생 검색\n4. 학생 정보 출력\n5. 프로그램 종료\n--------------------------------------------------------------------------------\n메뉴 선택 : ");
scanf("%d",&menu);
switch(menu){
case 1:
addNode(&head);
break;
case 2:
del_node(); //학생의 이름을 입력하고 이름이 일치하는 학생을 모두삭제
break;
case 3:
search_node();
break;
case 4:
print_node();
break;
case 5:
free_node();
break;
}
}
retu
728x90
'자료구조' 카테고리의 다른 글
[자료구조] C 이중연결리스트 예제문제 , 이중연결리스트 노드추가 , 노드삭제 , 노드삽입, 노드입력 (0) | 2020.12.04 |
---|---|
[자료구조] 이중 연결리스트 (double linked list) 요약 (0) | 2020.12.03 |
[자료구조] C 연결리스트 마지막 리스트에 노드 붙이기 (0) | 2020.12.03 |
[자료구조 기초] 연결리스트2 노드추가함수 코드 (0) | 2020.11.27 |
[자료구조 기초] C언어 스택(Stack) 개념 , 구현 , 소스코드 (0) | 2020.11.26 |