이중연결 리스트(Double Linked List)
C언어로 코딩한 이중연결 리스트(Double linked list)입니다. 연결 리스트를 코딩할 때는 방향 설정을 주의해서 코딩하셔야 합니다. 아래 소스코드는 학생의 이름과 점수를 받아서 이중연결 리스트로 데이터의 삽입, 삭제, 검색을 구현한 코드입니다.
/*
==============================================================
제목 : 학생 성적 관리 프로그램
version :
Copyright :
설명 : Double Linked List 를 사용한 성적 관리 프로그램
==============================================================
*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
/*
* 구조체 선언, 이름, 점수
*/
typedef struct _node{
char *name;
int score;
struct node *next;
struct node *prev;
}node;
node *head, *tail; // 기본적인 head와 tail 노드 선언
/*
* head, tail 생성(head와 tail에는 데이터가 저장되지 않음)
*/
void init(void){
head=(node*)malloc(sizeof(node));
tail=(node*)malloc(sizeof(node));
head->next=tail; // head와 tail의 방향 설정
head->prev=head;
tail->next=tail;
tail->prev=head;
}
/*
* 이중연결 리스트 안의 모든 데이터를 출력하는 printList 함수
*/
void printList(node *p){
printf("\n");
while(p!=tail){
printf("이름 : %s \t성적 : %-4d\n",&p->name, p->score);
p=p->next;
}
}
/*
* 이중연결 리스트 안에 데이터를 삽입 하는 insert 함수
* 삽입 방법 : head 와 다음 노드 사이에 삽입
*/
void insert(char *paraname, int parascore){
node *s; // 새로운 데이터를 저장하는 노드
node *t; // head 다음 노드를 가르키는 노드
s=(node*)malloc(sizeof(node));
s->name=paraname;
s->score=parascore;
t=head->next; // t노드에 head 다음 노드를 가르키게 함
head->next=s; // head 다음에 s 노드 삽입
s->prev=head;
s->next=t; // s노드 다음에 t노드를 가르키게 함
t->prev=s;
printf("****\n");
}
/*
* 이름을 파라미터로 하여 리스트 안에 데이터를 검색하는 find 함수
* 검색 방법 : 순차 검색 (head에서 tail 까지 순차적으로 검색)
*/
void find(char *name){
node *h;
int result=1; // 문자열 비교값 저장 변수
int count=0; // 검색 확인 변수
h=head->next;
while(h!=tail){
result=strcmp(&name, &h->name);
if(result==0){
printf("이름 : %s 성적 : %-4d \n", &h->name, h->score);
count++; // 검색 확인 카운터
}
h=h->next;
}
if(count==0){ printf("검색한 이름이 없습니다!\n"); }
}
/*
* 이름을 전달 받아 노드를 삭제한 nodeDelete 함수
* 순차 검색을 통해 파라미터로 받은 이름과 같은 노드를 삭제
*/
int nodeDelete(char *name){
node *t; // 삭제할 노드 t
node *n; // t 노드의 전 노드
node *p; // t 노드의 다음 노드
int result=1;
/* 순차 검색 시작 */
t=head->next;
while(t!=tail){
result=strcmp(&name, &t->name);
/* 노드 발견시 노드 삭제 */
if(result==0){
printf("이름 : %s 성적 : %-4d \n", &t->name, t->score);
if(t!=tail){
n=t->next;
p=t->prev;
p->next=n;
n->prev=p;
free(t);
break;
return 0;
}
}
t=t->next;
}
if(result==-1||result==1){ printf("검색한 이름이 없습니다!\n"); }
return 0;
}
/*
* 메인 함수
*/
int main(void){
int loop=1;
char *name;
int score=0;
init();
while(loop!=0){
printf("\n0: 종료 1: 입력 2: 출력 3. 검색 4, 삭제 ==> ");
scanf("%d", &loop);
if(loop==0){
break;
}else if(loop==1){
printf("이름 : "), scanf("%s", &name);
printf("점수 : "), scanf("%d", &score);
insert(name, score);
}else if(loop==2){
printList(head->next);
}else if(loop==3){
printf("검색할 이름 : "), scanf("%s", &name);
find(name);
}else if(loop==4){
printf("삭제할 이름 : "), scanf("%s", &name);
nodeDelete(name);
}
}
return 0;
}
[결과]
[텍스트 파일]