리눅스에서 간단한 링크드 리스트를 짜봤습니다. 실행결과가 스샷처럼 나오는 이유가 궁금합니다.

obshaha의 이미지

모두들 수고가 많으십니다. 공부를 하던중..
링크드 리스트를 간단하게 짜봤습니다. 기능이 되긴 하는것 같으나..
노드 삭제나 노드 검색을 하면.. 스샷처럼 결과가 이상하게 되버리네요.. ;;
이유가 뭔지... ;; 어떤 부분을 더 공부해야 될까요? ;;

아래는 소스입니다.

#include
#include
#include
#include

typedef struct listnode *list; // 구조체 포인터형 정의

struct listnode // 구조체 정의
{
char name[4];
list link;
};

list head;
list tail;

void create()// 노드 생성
{
head=(list)malloc(sizeof(list));
tail=(list)malloc(sizeof(list));
strcpy(head->name, "head");
head->link = tail;
strcpy(tail->name, "tail");
tail->link = NULL;
}

void insert(char *data) // 인자로 받은값 넣은 노드 삽입
{
list node;
node=(list)malloc(sizeof(list));
strcpy(node->name, data);
node->link=head->link;
head->link=node;
}

void delete(char *data) // 인자로 받은값 해당하는 노드 삭제
{
int count=0;
list temp, del;
temp=head;

while(temp->link!=tail)
{
if(!strcmp(temp->link->name, data))
{
del=temp->link;
temp->link=temp->link->link;
free(del);
count++;
continue;
}
else
temp->link=temp->link->link;
}

printf("총 %d개의 노드를 삭제하였습니다.\n", count);
}

void search(char *data) // 인자로 받은 노드값과 같은 노드 출력
{
int count=0;
list temp;
temp=head;

while(temp->link!=tail)
{
if(!strcmp(temp->link->name, data))
{
count++;
temp->link=temp->link->link;
continue;
}

temp->link=temp->link->link;
}

printf("head와 tail 사이에 구하려는 값이 있는 노드의 수는 총 %d개입니다.\n", count);
}

void show() // 노드 출력
{
list loop = head->link;
printf("head ->");

while(loop!=tail)
{
printf("%s ->", loop->name);
loop=loop->link;
}

printf("tail\n");
}

void menu()
{
printf("1 : 노드 생성\n");
printf("2 : 노드 삽입\n");
printf("3 : 노드 삭제\n");
printf("4 : 노드 찾기\n");
printf("5 : 노드 출력\n");
}

main()
{
int num;
char buffer[4];

while(1)
{
menu();
printf("숫자를 입력하세요 : ");
scanf("%d", &num);

switch(num)
{
case 1 :
create();
break;

case 2 :
printf("data값으로 넣을 말을 쓰세요 : ");
scanf("%s", buffer);
insert(buffer);
break;

case 3 :
printf("data값으로 넣을 말을 쓰세요 : ");
scanf("%s", buffer);
delete(buffer);
break;

case 4 :
printf("data값으로 넣을 말을 쓰세요 : ");
scanf("%s", buffer);
search(buffer);
break;

case 5 :
show();
break;

default :
printf("값을 잘못 입력했습니다. 따라서 종료됩니다.\n");
exit(1);
}
}
}

File attachments: 
첨부파일 크기
Image icon 1.png41.26 KB
Image icon 2.png44 KB
ymir의 이미지

search 나 delete 에서 node 탐색할 때 보면..

temp->link = temp->link->link; 로 하셨는데..

이 코드는 linked list 의 데이터를 직접 수정하는 코드입니다.

node 삭제할 때 빼고는 temp = temp->link; 로 써야 할 것 같네요.

추가로 ..=(list)malloc(sizeof(list)); 는 sizeof(struct listnode) 로 바꾸는게 맞겠네요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.