Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[1708] Re:[질문]링크드 리스트에 대한건데요....좀 봐주세요...^^*
남병철.레조 [lezo] 1549 읽음    2002-12-11 21:09

헉;; 링크드리스트 할때 답답했던걸 떠올리며 답변 달아줘야지... 하고 생각했는데
소스를 주욱;; 올려주셨네요 ^^;;

틈을 내어 쓰는것이기에 자세히 읽어보지는 못했습니다.
next에 NULL을 넣는곳이 있는걸로 봐서 single linked list인것 같은데...
전체적으로 만드는 구조를 설명해드리죠...
일단 링크드리스트는 new로 메모리 공간을 할당해서 전역 포인터 변수로 시작
지점을 잡습니다. 이것이 init 함수입니다.
링크드 리스트의 모든 기능이 시작하는 시점은 이 전역 포인터 변수를 이용해서
new로 생성된 리스트들에 접근하는 것입니다.

그 이후 데이타가 추가되면 아래의 함수를 예로 들어서 in_link를 쓰고 지울땐 de_link를
사용합니다.
또한 데이터를 검색하여 원하는 데이터에 해당하는 값을 얻어오려면 링크드리스트를 순회하는
함수가 있어야 하는데 그것이 traverse입니다.
내용이 재귀함수를 사용하여서 작성되었기에 좀 직관적이지 못한면이 없지않지만 그만큼
코드의 길이는 줄어들겠지요. exit_link는 재귀호출로 각 리스트들을 delete로 지우는
함수이네요.

처음 만드실때는 궂이 재귀호출을 사용하지 않으셔도 좋을듯합니다.

링크드 리스트의 구조체
링크드 리스트의 구조체 전역 포인터 변수
InitList(), AddList(), DeleteList(), SearchList(), FreeList()

InitList로 링크리스트의 기본 구성을 잡는다
AddList 또는 DeleteList로 추가 삭제 작업
SearchList로 저장되어 있는 데이터를 읽어 온다.
FreeList로 해당 링크리스트를 지운다.


typedef struct link_t {                           
char ch[3];
int num;
struct link_t *next;
} link;


위 구조체를 사용한다면...
link *tmpLink;
tmpLink = Head;// 링크드리스트의 구조체 전역 포인터 변수
while( tmpLink->next != NULL ) {
    if( tmpLink->num == 1 ) // 찾는데이타이다.
      break;

    tmpLink = tmpLink->next; // 다음 링크로 이동
}

재귀호출 보다는 이런식의 루프를 쓰면 좀더 코드의 이해가 쉬워질것입니다.
링크드리스트의 기본적 구조를 직접 그려보시고 각각 new로 할당한 메모리를
(구조체를 new로 할당하는 것이지요...)
각 함수가 어떻게 조작할지를 생각하며 직접 구현해 보시면 앞으로 프로그램을
만들때 기본적이지만 많은 도움이 될것입니다.





조은휘 님이 쓰신 글 :
: 소스를 이해해야하는데요
:
:
:
: 큰 내용은 이해를해서 주석을 달아놓았거덩요...
:
:
:
: 근데요...세부적인 부분의 의미를 모르겠어요...
:
:
:
: 이해할 수 있도록..세부적인 주석을...좀 부탁드려도 될까요?^^
:
:
:
: 행복한 12월 되세요 ^^*
:
:
:
: 읽어주셔서 감사합니다 (--)(__)
:
:
:

:
:
:
: /* 프로그램 설명
: < 단순 연결 리스트 구현 >
:
:
:
: 1.노드 구성 (struct _node)
: name: 문자열 → char name[3];
: score: 정수형 → int score;
: next: 다음 노드 포인터 → struct _node *next;
: 2.조작 팁(tip)
: headp: 하나의 포인터 사용 (head pointer)
: 3.구현되어야 하는 연산
: ordered_insert: 삽입 연산 ? score의 순서에 따라
: delete: 삭제 연산 ? name으로 node 선택
: traverse: 탐색 연산 (recursive)
: exit: 종료 연산 ? memory free (recursive)  */
:
:
:
: #include <stdio.h>                                 
: #include <conio.h>                                 
: #include <stdlib.h>                                
: #include <string.h>                                
:
:
:
: typedef struct link_t {                           
:  char ch[3];
:  int num;
:  struct link_t *next;
: } link;
:
:
:
: void in_link(char word[],int i);//입력하는 함수
: void de_link(char word[]);//삭제하는 함수
: void traverse(link *heap);//보여주는 함수
: void exit_link(link *heap);//끝내는 함수
: void init_link();
:
:
:
: link *topp;
: link *curr;
:
:
:
:
: void main ()
: {
:  int menu;
:  init_link();
:
:
:
:  do {
:   printf("select menu(1.insert  2.delete  3.traverse  4.exit) : ");
:   scanf("%d",&menu);
:    
:   switch (menu)
:   {
:    case 1:
:    {
:     char name1[3];
:     int score;
:     printf("name? : ");
:     scanf("%s",name1);
:     printf("score? : ");
:     scanf("%d",&score);
:     in_link(name1,score);
:     break;
:    }
:    case 2:
:    {
:     char name2[3];
:     printf("name? : ");
:     scanf("%s",name2);
:     de_link(name2);
:     break;
:    }
:    case 3:
:    {
:     printf("이름  점수\n");
:     curr=topp;   
:     traverse(curr);
:     break;
:    }
:    case 4:
:    {
:     printf("이름  점수\n");
:     curr=topp;
:     exit_link(curr);
:   
:     break;
:    }
:   default:
:    {
:     printf("wrong select.");
:    }
:   }
:  } while (menu!=4);
: }
:
:
:
:
: void in_link(char word[],int i)//삽입연산,score 순서에 따라 삽입
: {
:  link *prep;
:  link *curp;
:  link *temp;

:  prep=topp;
:  curp=prep->next;
:
:
:
:  temp=(link *)malloc(sizeof(link));
:  strcpy(temp->ch,word);
:  temp->num=i;


:  if(curp!=NULL)
:  {
:   while(i>=curp->num)
:   {
:    prep=curp;
:    curp=curp->next;
:    if (curp==NULL) break;
:   }
:
:
:
:   if(curp!=NULL)
:   {
:    prep->next=temp;
:    temp->next=curp;
:   }
:  }
:
:
:
:  if(curp==NULL)
:  {
:   prep->next=temp;
:   temp->next=NULL;
:  }
: }
:
:
:
:
: void de_link(char word[])
: /*delete
: name에 맞는 노드를 삭제
: 아이디어
: 삭제할 노드의 name 입력
: headp 기준
: 마지막 노드인 경우
: 노드를 free 시킨 후, 노드의 끝을 NULL로 만들어 준다
: 마지막 노드가 아닌 경우
: 노드의 포인터를 바꾼 후, 노드를 free 시킨다*/
: {
:  link *prep;
:  link *delp;
:  int qqq=0;
:
:
:
:  prep=topp;
:  delp=prep->next;
:
:
:
:  if(delp!=NULL)
:  {
:   while(strcmp(word,delp->ch)!=0)
:   {
:    prep=delp;
:    delp=delp->next;
:    if (delp==NULL)
:    {
:     qqq=1;
:     break;
:    }
:   }
:  }
:  if(qqq==1) printf("There''s nothing.\n");
:  else
:  {
:   prep->next=delp->next;
:   free(delp);
:  }


: }
:
:
:
: void traverse(link *heap)
: /* 탐색연산
: 리스트의 노드 데이터들을 보여주는 함수
: 재귀적(recursive)으로 구현
: 아이디어
: 1.리스트가 없는 경우
: 출력 없이 return
: 2.리스트가 있는 경우
: 노드 데이터 출력 후, 나머지는 재귀 함수의 매개변수로 넘겨준다
: 3.알고리즘
: 초기 호출 시에 traverse의 매개변수는 headp를 기준한다*/
: {
:  link *tmpp;
:  tmpp=heap->next;
:  if(heap->next!=NULL)
:  {
:   printf("%4s  %4d\n",tmpp->ch,tmpp->num);
:   traverse(heap->next);
:  }
: }
:
:
:
:
: void exit_link(link *heap)
: /*exit
: 메모리의 모든 공간을 free 시킨 후 종료하는 함수
: 재귀적으로 구현
: 아이디어
: traverse와 유사
: 리스트가 없는 경우
: headp까지 free
: 리스트가 있는 경우
: 노드를 free 시킨 후, 나머지 노드를 재귀 함수의 매개변수로 넘긴다*/
:
:
:
: {
:  if(heap->next!=NULL)
:  {
:   link *afterp;
:   afterp=heap->next;
:   printf("%4s  %4d\n",afterp->ch,afterp->num);
:   free(heap);
:   exit_link(afterp);
:  }
: }
:
:
:
: void init_link()
: {
:  topp=(link *)malloc(sizeof(link));
:  topp->next=NULL;
:  curr=(link *)malloc(sizeof(link));
: }
:
:
:
:


:
:

+ -

관련 글 리스트
1703 [질문]링크드 리스트에 대한건데요....좀 봐주세요...^^* 조은휘 1448 2002/12/10
1708     Re:[질문]링크드 리스트에 대한건데요....좀 봐주세요...^^* 남병철.레조 1549 2002/12/11
1709         Re:Re:[질문]링크드 리스트에 대한건데요....좀 봐주세요...^^* 조은휘 1373 2002/12/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.