정보 처리/자료구조

이중연결 리스트(Double Linked List)

본클라쓰 2010. 3. 21. 23:15

 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;
}

 

 

[결과]

 

 

[텍스트 파일]   

'정보 처리 > 자료구조' 카테고리의 다른 글

맵(Map)  (0) 2010.06.17
배열(Array)  (0) 2010.06.17
트리(Tree)  (0) 2009.10.27
큐(Queue)  (0) 2009.10.27
스택(stack)  (0) 2009.10.27