Q&A

  • linked list 에 관한 간단한 예제좀 구할수 있을까여?
linked list 에 관한 간단한 예제좀 구할수 있을까여?
고수님들 간다하게 예제좀 만들어 주시면 정말 감사하겠습니다

1  COMMENTS
  • Profile
    착한천사 2005.03.06 23:09
    착한천사 김경록입니다.
    제가 알기로는 linked list에는 많은 종료가 있다는걸로 아는데요..
    N-Linked list
    쉽게 말해서, 단방향, 양방향, N방향 으로 나눠졌떤거 같던데..
    즉, 단방향의 예는 워낙 안좋다보니 별로 없네용(사실 제가 거의 안써봐서리.) 흐흐흐..
    양방향은 B-Tree,
    N방향은 B*-Tree 구현에 썼던걸로 기억이 가물가물하게 나는군요

    그러니까, 제가 옛날.. 아주 옛날.. 그러니까.. 96년도에..
    C++로 구현한적이 있었는데..
    무쟈게 쉬웠던걸로 기억이 나는군요..
    Tree구조에서 Full-Tree구조를 만드는게 굉장히 귀찮았던걸로
    기억이 나는데..

    일반, 단방향 linked llist는 아주, 무쟈게 쉬울겁니다..
    "이론 = 실기"의 대표적 사례라고 할 수 있겠죠..
    물론, linked list의 기본 이론은 아실꺼라 생각하고
    그적그적 적어가보도로 하죠..
    단방향 linked list의 최대 단점은, liked list의
    중간에 있는 놈을 제거해 버리면, linked list는 아작나 버린다는
    그런 엄청난 단점을 가진 linked list입니다.
    N방향 linked 리스트는
    선행 레코드의 포인트와 다음 레코드의 포인트, 그리고 값을 가지는
    3가지 유형을 가진 record 혹은 class들의 연결이라고 보시면 됩니다.


    서론이 길었네요..
    아래 예제는 record로 구현한 단방향 linked list의 예제입니다..
    (사실, linked list에서는 record나 class나 뭐.. 거기서 거기.. 큽큽)


    <!--CodeS-->
    unit Unit1;

    interface

    uses Windows, Messages, SysUtils, Classes, Controls, FORMS, StdCtrls,
      ExtCtrls;

    Type
       RLinkedList = Record
           r_Value: ShortString;
           r_NextRecord: Pointer;
       End;

    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        Panel1: TPanel;
        Label1: TLabel;
        Button2: TButton;
        Label2: TLabel;
        Edit1: TEdit;
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure FormCreate(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
          prp_LinkedRoot: Pointer;  // Linked List의 Root (첫시작점)
          prp_CurrentNode: Pointer;
      protected
          Procedure AddLink(as_Value: ShortString); //Link를 추가합니다..
          Procedure ReadLink; //추가한 Link list를 쭈~~욱 읽어 봐야죠?
                              //추가한 순서대로 되었는지 확인도 해야되고..
      Public
          //생성자를 재선언할 필요는 없지만,
          //Class를 안쓸수도 있기 때문에 일부러 선언,
          //기냥, Project를 시작하니까, 덜렁 Form이 하나 나타나서리..
          //귀차니즘으로 인하여.. Form을 안바꾸고.. 그냥 Coding함.. 큽큽..
          //귀차니즘을 이해하시길..
          Constructor Create(Owner: TComponent); override;
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}


    { TForm1 }

    Procedure TForm1.AddLink(as_Value:ShortString);
    Var
        l_LinkedList: ^RLinkedList;  //꼭 ^RLinkedList를 안쓰고, Pointer를 사용해도 상관없음
    begin                            //왜 그런지 Memory Address 차원에서 생각해 보셈.. 너무 쉽나??
        Try
            GetMem(l_LinkedList, SizeOf(RLinkedList));
        Except
            On EOutOfMemory Do
            Begin
                MessageBox(Self.Handle, 'Memory가 부족합니다..', '에러', MB_ICONERROR);
                Exit;
            End;
        End;

        With RLinkedList(l_LinkedList^) Do
        Begin
            r_Value      := as_Value;
            Memo1.Lines.Add(as_Value); //추가한거 보기.. 큽큽.. 나중에 추가한 순서대로 있나 확인용
            r_NextRecord := Nil;
        End;

        //Root가 NULL이면, Root에 현재 생성한 Link를 할당한다.
        //그렇지 않으면, 현재 할당받은 Recorder의 Pointer를
        //현재 위치 Pointer(prp_CurrentNode)에 할당하여,
        //마지막 Node의 위치를 이동한다.
        If prp_LinkedRoot = Nil Then
        Begin
            prp_LinkedRoot := l_LinkedList;  //첫번째 추가는 Root에 할당
            prp_CurrentNode:= l_LinkedList;  //첫번째 추가일때는 마지막 Node는 항당 Root
        End
        Else Begin
            RLinkedList(prp_CurrentNode^).r_NextRecord := l_LinkedList; //최초
            prp_CurrentNode := l_LinkedList;  //추가된곳에 현재 Node 이동
        End;
    end;


    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
        //Linked List의 효용이 끝났을 시에는 Memory를 해제시켜야함..
        //Getmem으로 할당받은 Memory는 FreeMem으로 해제시켜야 하는데..  못하겠네.. 큰일이당..
        //왜냐하면, 단일 Linked list의 최대 단점인 list의 중간에서
        //Link를 끊어 버리면, 그 이후부터의 Linked List에 대한
        //Memory 해제를 할 수 없다는 최대의 단점 발생..
        // 간단히 말해서, 연결이 끊어진 놈들의 Memory 해제는 불가능하다는 뜻..
        // 내 PC 맛가는거 아닌가.. 모르겠네.. 큽큽
        prp_LinkedRoot  := Nil;
        prp_CurrentNode := Nil;
    end;

    Constructor TForm1.Create(Owner: TComponent);
    begin
        inherited Create(Owner); //상속처리

        prp_LinkedRoot  := Nil; //Linked List의 Root
        prp_CurrentNode := Nil; //Linked List Terminal Node(최고말단)는 없음
    end;

    procedure TForm1.ReadLink;
    Var
       l_CurNode: Pointer; //제가 l_CurNode의 Type을 ^RLinkedList로 선언안했는지
                           //헷갈리시죠? 연구해 보세요.. 이건 문제에요.. 이것도 너무쉽나요?
                           //문제를 만들려고, Pointer와 ^RLinkedList를 섞어보긴 했습니다만..
                           //너무 쉬운가요?? 큽큽
    begin
        l_CurNode := prp_LinkedRoot;
        While l_CurNode <> Nil Do
        Begin
            MessageBox(Self.Handle, PChar('값 : ' + RLinkedList(l_CurNode^).r_Value), '알림',
                       MB_ICONWARNING);
            l_CurNode := RLinkedList( l_CurNode^ ).r_NextRecord;
        End;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
        Memo1.Lines.Clear;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
        ReadLink;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
        If Trim(Edit1.Text) = '' Then
        Begin
            MessageBox(Self.Handle, '추가할 문자는 넣으셔야죵~~', '경고', MB_ICONERROR);
            Exit;
        End;
        
        AddLink(Edit1.Text);
    end;

    end.
    <!--CodeE-->

    • 김길남
    • 2005.03.07 04:49
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 주재환
      2005.03.08 22:09
      adoquery.sql.append 대신에 adoquery.sql.text를 써보세요....
    • 심효기
    • 2005.03.06 21:47
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2005.03.06 23:36
      착한천사 김경록입니다.. 혹시, MDI의 child form을 최소창으로 만드시는게 아닌지.. 그럼.. 기본적으로 ...
    • 구창민
      2005.03.07 19:03
      안녕하세요.. 혹시 F7 키로 디버깅 하시는건 아니신지요? 함수내부로 진입하지 않으시려면 F8 키를 ...
    • 남경만
    • 2005.03.05 08:17
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이규하
      2005.03.05 12:29
      만약, TQuery  를 더블 클릭 하셔서, 마우스 오른쪽 버튼으로 Add all fields 하신다음에, 해당 ...
    • 남경만
      2005.03.07 04:38
      덕분에 쉽게 해결하였습니다.. ^^ 그리고 또 다른 하나를 배웠네요.. 맨날 배워만가고.. 저도 어여 스...
    • 정승유
    • 2005.03.05 07:45
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2005.03.06 23:09
      착한천사 김경록입니다. 제가 알기로는 linked list에는 많은 종료가 있다는걸로 아는데요.. N-Linked li...
    • 박진규
    • 2005.03.05 05:08
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 도깨비
      2005.03.23 21:58
      첨부화일을 작업중인 프로젝트 폴더에 압축해제 하시고, iodll.txt화일을 참조하시어 명령사용법은 ...
    • 델피언
    • 2005.03.05 04:23
    • 2 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2005.03.05 08:56
      온라인 도움말의 일부내용입니다. loCaseInsensitive로 도움말을 검색해보세요. ^^; loCaseInsensit...
    • Crazy™
      2005.03.05 19:23
      주로 제가 퀀텀그리드를 쓰는데 그리드 kefield 란 부분이 안맞는 경우 이런증상이 생깁니다. 편법이지만 ...
    • Crazy™
      2005.03.05 19:09
      안녕하세요. 루프문으로 돌릴때처럼 똑같이 CompositeReport에 추가하면 됩니다. 5개의 리포트를 생성 후...
    • 송동규
      2005.03.07 17:38
      먼저 답변 감사드립니다. 하지만 똑같이 루프를 돌려서 CompositeReport를 하면 (내부적으로 reports...
    • 이상호
    • 2005.03.05 00:04
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 서해근
    • 2005.03.04 21:48
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 박지용
      2005.03.04 22:38
      TDBComboBox연결된 Dataset과 나머지 컨트롤들의 dataset이 틀릴경우 간단하게 처리할려면 두 테이...
    • 서해근
      2005.03.04 22:55
      소스를 깜빡하고 올리지 않았네요;; 테이블은 TBLDATA라고 한개를 썼습니다. procedure Tmain.Form...
    • 무심코
      2005.03.05 00:33
      거의 다 만드신것 같은데.... 소스를 보다가 이해가 안되는 부분이 있어 몇자 적습니다. 1. 내용를 보니...
    • 서해근
      2005.03.05 19:01
      가르쳐 주셔서 감사합니다 ^^
    • Crazy™
      2005.03.05 19:19
      무심코 님의 내용처럼 locate를 이용해서 찾을 수도 있지만 콤보박스가 dbcombo 인데 그냥 연결만 해도 됩...
    • 이규하
      2005.03.05 12:50
      메인에서 차일드 폼을 부를 경우 <!--codeS--> with Tchform.create(application) do Try  ...
    • 조운석
      2005.03.04 22:14
      메인폼에서 <!--CodeS--> FPopup = TFPopup.Create(Self); if (FPopup.ModalResult = mrO...
    • 김일근
    • 2005.03.04 18:35
    • 2 COMMENTS
    • /
    • 0 LIKES
    • K모씨
      2005.03.04 23:06
    • nilriri™
      2005.03.05 04:25
      코멘트가 달린거 같은데 안보이네요..^^ 어떤 내용인지 몰라서 저도 한자 적습니다.. 라이센스 부족&...
    • 석주현
      2005.03.04 17:21
    • 이중철
      2005.03.04 19:49
    • 정찬희
      2005.03.04 04:12
      TList에 아이템을 집어넣으면 전부다 Pointer형으로 바뀌어 들어갑니다... 가져나올때도 Pointer로만 인식...
    • 세일러문
      2005.03.04 18:41
      답변감사합니다.. 그런데요... 님께서 말씀하신대로.. TList(TList.Items[i]).Count 이대로 했는데...
    • nilriri™
      2005.03.04 19:55
      <!--CodeS-->     TList(ShapeList .Items[i]).Count; <!--CodeE--> ...
    • 주재환
    • 2005.03.03 20:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2005.03.04 00:17
      안녕하세요.. 이런 답변을 원하신게 아니시겠지만, 제가 볼때는 같은 기능을 하는 폼을 하나 만드시...
    • 석주현
      2005.03.04 17:23
    • 유효근
    • 2005.03.03 12:15
    • 7 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2005.03.03 17:42
    • 무심코
      2005.03.03 18:26
    • 유효근
      2005.03.04 12:28
    • 귀폭
      2005.03.04 03:39
      소스 올립니다... 원하시는데로 고쳐서 쓰세요...
    • 유효근
      2005.03.04 12:28
      정말 감사합니다.^^
    • 유효근
      2005.03.04 02:20
      코멘트 다는 곳이 사라졌네요..^^; 혹시 코멘트 다신분~ 다시 리플로 답변해 주실수 있나요?.^^; 부...
    • 마이크로김
      2005.03.05 03:20
      formatdatetime('YYYY-MM-DD',now + 100)
    • 델피언
    • 2005.03.03 08:33
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 박지용
      2005.03.04 22:43
      sex 필드가 text 타입이기 때문이죠...^^ 필드의 타입이 문자 또는 문자열의 경우는 '   ' 로...
    • nilriri™
      2005.03.04 07:14
      저 쿼리가 맞나요? 희안하네..틀린거 맞는데요..^^;  컴터는 거짓말 안하거든요.. 야근 많...
    • 델피언
      2005.03.04 08:25
      ㅡㅡ; 아이구 내가 미챠~ 컴파일시 오류없이 넘어가길래 아무 생각없이... 예전부터 from 을 form하고...
    • nilriri™
      2005.03.04 10:52
      이것봐요..내 이러실줄 알았습니다..^^; 글쓴 시간이 23시네..ㅋㅋㅋ 하긴 저두 새벽이지만.. 구인/구직...
    • 심재용
      2005.03.03 09:55
      ADODataset1.commandtext := 'select * form people where sex=남'; 위 문장의 sex=남 부분을 sex=''남'...