[질문] C언어 더블링크드 리스트 질문입니다.

nerd™의 이미지

책보고 공부 하면서 더블링크드로 주소록을 만들고 있습니다만
여기부분은 맞다고 생각되고 검토도 여러번 해보고 책도 참고 했는데
왜 안되는지 모르겠습니다.
도움좀 주세요!

1.첫번째 질문입니다.


[노드 상태]
head - node1 - node2 - temp1 - tail 
==> temp1이 tail앞까지 이동시키고 temp1과 tail사이에 temp2를 삽입하는 과정
head - node1 - node2 - temp1 - temp2 - tail

[tail앞까지 넘겨주는 과정]
temp1=head->next;

    while(temp1->next != tail)
    {
            temp1=temp1->next;
    }

[소스1번]
	temp1->next=temp2; //1)
	temp2->prev=temp1; //2)
	temp2->next=tail;  //3)
	tail->prev=temp2;  //4)     
	
[소스2번]
	tail->prev->next=temp2; //1)temp1->next 과 tail->prev->next 차이점? tail->prev가 temp1같은거 아닌가요?.
	temp2->prev=tail->prev; //2)temp1 과 tail->prev의 차이점? 역시 tail->prev가 temp1이 아닌가요?
	temp2->next=tail;       //3) 3과 4는 동일!
	tail->prev=temp2;       //4)/*

[출력결과 값이 다름!]
1번 쓰레기값과 마지막 도느 출력안됨!
2번 마지막 입력한 한개 노드 출력안됨!

소스1번과 소스2번의 1),2)번의 차이점이 있는지요?
출력을 했더니 1번소스로 출력할때와 2번으로 출력할때랑 다르더군요.

2.두번째질문은 출력에 관한 질문인데요.
출력이 데이터를 3개 입력하면 2개만 출력되고 4개 입력하면 3개만 출력되네요.

node *temp;
    temp = (node *)malloc(sizeof(node));
    temp = head->next;
	
    if(temp->next == tail)
    {
            puts("###데이터가 없습니다!###");
            menu();
    }
    printf("Head Next %p\n", temp);
    puts("=========================");
        while(temp->next != tail)
        {
				
                printf("point ==> %p\n", temp);
                printf("번호: %d\n",temp->num);
                printf("이름: %s\n",temp->name);
                printf("전화번호: %s\n",temp->tel);
                printf("e-amil :%s\n",temp->mail);
                puts("=========================");
                temp=temp->next;
        }
    

어디가 문제인거죠?
첫번째 질문에 있는 곳에서 링크드연결이 잘 못된건가요?
도움좀 주세요!

혼자 공부 하다가 kldp에 처음으로 질문 올립니다.
질문하는 방식이 잘못됬다거나 그래도 양해해주시고 조언바랍니다.
제가 왕초보라서 쉽게 알려주시면 감사하겠습니다.

eminency의 이미지

1번은 소스를 몰라 정확히 모르겠지만 tail까지 넘겨주는 과정에 문제가 있는 것 같습니다.

그리고 2번은 next가 tail이면 멈추므로 맨 마지막 것을 출력하기 전에 멈추게 되겠지요.

while(temp != tail) 로 바꾸셔야 할 거 같습니다.

그리고 temp는 이미 할당되어 있는 주소값을 넣어주기 위한 포인터 변수이므로 malloc는 필요없습니다.

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

yui의 이미지

중간에 마음대로 좀 잘라내겠습니다.

nerd™ wrote:


[소스1번]
	temp1->next=temp2; //1)
	temp2->prev=temp1; //2)
	temp2->next=tail;  //3)
	tail->prev=temp2;  //4)     
	
[소스2번]
	tail->prev->next=temp2; //1)temp1->next 과 tail->prev->next 차이점? tail->prev가 temp1같은거 아닌가요?.
	temp2->prev=tail->prev; //2)temp1 과 tail->prev의 차이점? 역시 tail->prev가 temp1이 아닌가요?
	temp2->next=tail;       //3) 3과 4는 동일!
	tail->prev=temp2;       //4)/*

소스1번과 소스2번의 1),2)번의 차이점이 있는지요?
출력을 했더니 1번소스로 출력할때와 2번으로 출력할때랑 다르더군요.


temp1 == tail->prev면 말씀하신대로 동일해야 합니다.
소스2번 들어가기 전에 temp1이 tail->prev와 다르지 않을까 싶네요.
한번 확인해보세요.

Quote:

2.두번째질문은 출력에 관한 질문인데요.
출력이 데이터를 3개 입력하면 2개만 출력되고 4개 입력하면 3개만 출력되네요.

node *temp;
    temp = (node *)malloc(sizeof(node));
    temp = head->next;



엇엇.. malloc했던 메모리가 새고 있습니다.
고치셔야 합니다.

출력 해결법은 eminency님이 말씀하셨으니...

그림을 그려가면서, (주로 포인터는 네모박스에서 화살표를 바깥방향으로 그리죠.)
고민하시면 쉽게 이해하실 수 있으실 겁니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.