#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
struct EMP {
int hakbun;
char name[20];
int age;
char address[40];
struct EMP *rnext, *lnext;
} *ptr;
struct EMP *head=NULL, *x=NULL, *prev;
int del_hakbun;
void insert(void);
void del(void);
void prt(void);
void maximum(void);
void minimum(void);
void sumave(void);
main()
{
int sel;
while(1) {
printf("1. 레코드 추가/삽입\n2. 레코드 삭제\n3. 최연장자 출력\n4. 최연소자 출력\n5. 나이 합계/평균 출력\n6. 출력\n7. 종료\n원하시는 작업은 ? ");
scanf("%d", &sel);
switch(sel) {
case 1 : insert();
break;
case 2 : if(head==NULL)
printf("삭제할 레코드가 없습니다. 다시 입력해주세요.\n");
else {
del();
}
break;
case 3 : if(head==NULL) //레코드에 값이 없다면 다시 입력하도록 출력
printf("레코드가 추가되어 있지 않습니다. 다시 입력해주세요.\n");
else {
maximum();
}
break;
case 4 : if(head==NULL) //레코드에 값이 없다면 다시 입력하도록 출력
printf("레코드가 추가되어 있지 않습니다. 다시 입력해주세요.\n");
else {
minimum();
}
break;
case 5 : if(head==NULL) //레코드에 값이 없다면 다시 입력하도록 출력
printf("레코드가 추가되어 있지 않습니다. 다시 입력해주세요.\n");
else {
sumave();
}
break;
case 6 : prt();
break;
case 7 : exit(1);
default : printf("입력이 잘못되었습니다.\n\n");
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
void insert(void)
{
ptr=(struct EMP*)malloc(sizeof(struct EMP));
if(ptr==NULL) {
printf("Heap영역할당오류 \n");
exit(1);
}
printf("학번 ? ");
scanf("%d", &ptr->hakbun);
fflush(stdin);
printf("성명 ? ");
gets(ptr->name);
printf("나이 ? ");
scanf("%d", &ptr->age);
fflush(stdin);
printf("주소 ? ");
gets(ptr->address);
ptr->rnext = NULL;
if(head == NULL) //첫번째 영역(헤드)에 값이 없다면
head=x=ptr; //입력받은 값을 헤드에 넣기
else //두번째 입력부터는 아래것을 적용
{
while(x != NULL)
{
if(x->hakbun == ptr->hakbun) { //x(헤드)의 학번과 입력받은 학번이 같을경우 중복메시지후 리턴
printf("학번이 중복되었습니다. 다시 입력하세요.\n\n");
break;
}
if(x->hakbun > ptr->hakbun) //x(헤드)의 학번이 입력받은 학번보다 클 경우
{
if(x == head) //x(헤드)와 헤드의 값이 같을 경우
{
ptr->lnext=head;
ptr->rnext=head->rnext;
head->rnext=ptr->lnext;
head->rnext=ptr;
} //if종료
else //아니면
{
x->lnext=ptr;
x->rnext=ptr->rnext;
ptr->rnext=x->lnext;
ptr->rnext=x;
prev->rnext=ptr;
} //if종료
break;
} //if종료
else if(x->rnext == NULL) //다음주소의 값이 없을경우
{
ptr->lnext=x;
ptr->rnext=x->rnext;
x->rnext=ptr->lnext;
x->rnext = ptr;
break;
} //if종료
prev=x;
x = x->rnext;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
void del(void)
{
printf("삭제할 내용을 입력하세요");
scanf("%d", &del_hakbun);
ptr=head;
while(ptr) {
if(del_hakbun == ptr->hakbun)
{
if(ptr == head){
ptr->lnext->rnext = ptr->rnext;
ptr->rnext->lnext = ptr->lnext;
}
else {
prev->lnext->rnext = prev->rnext;
prev->rnext->lnext = prev->rnext;
}
free(ptr);
break;
}
ptr=ptr->rnext;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void maximum(void) //최대나이구하기
{
int max=0;
max = head->age;
ptr=head;
while(ptr != NULL) {
if(max < ptr->age)
max=ptr->age;
ptr=ptr->rnext;
}
printf("최연장자는 %d세입니다.\n\n", max);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void minimum(void) //최소나이구하기
{
int min=0;
min = head->age;
ptr=head;
while(ptr != NULL) {
if(min > ptr->age)
min=ptr->age;
ptr=ptr->rnext;
}
printf("최연소자는 %d세입니다.\n\n", min);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void sumave(void) //나이합계구하기
{
int sum = 0, count = 0;
float aver = 0.0;
ptr=head;
while(ptr != NULL) {
sum = sum + ptr->age;
count++;
ptr = ptr->rnext;
}
aver = (float)sum / count;
printf("나이의 합은 %d이고, 나이의 평균은 %.1f입니다.\n\n", sum, aver);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void prt(void) //출력하기
{
ptr=head;
while(ptr)
{
printf("학번 : %d 이름 : %s 나이 : %d 주소 : %s\n", ptr->hakbun, ptr->name, ptr->age, ptr->address);
ptr=ptr->rnext;
}
}
이게 전체소스야.
저기서 내가 글자진하게 한 부분이 노드삭제부분이거든..
근데 삭제를하면 자꾸 에러가 떠 ㅠㅠ
뭐가 문젠지 좀 봐줘 ㅠㅠ c언어야..
// 데이터를 입력(학번, 이름, 주소, 나이) 후에 데이터에 있는학번과 삭제할 학번이 일치하면 그 노드를 삭제하는거거든..
right, left 아니면 before, next지 무슨 rnext, lnext라고 쓴겨
내가 이거 책보고했는데 책에 그렇게 나와있었거든.. 단일 연결리스트가아니라 이중연결리스트라서..
rnext가 rightnext고 lnext가 leftnext일거야
왜 del에서 틀렸다고 생각하오? insert가 맞았다고 왜 가정함?
insert는 제대로 되던데..
선물옵션공부→【주소▶affn5.w70.kr◀복사】←선물옵션공부◇선물옵션공부◇선물옵션공부━━선물옵션공부