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

+ Recent posts