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;
}
[결과]
[텍스트 파일]