리눅스에서 간단한 링크드 리스트를 짜봤습니다. 실행결과가 스샷처럼 나오는 이유가 궁금합니다.
모두들 수고가 많으십니다. 공부를 하던중..
링크드 리스트를 간단하게 짜봤습니다. 기능이 되긴 하는것 같으나..
노드 삭제나 노드 검색을 하면.. 스샷처럼 결과가 이상하게 되버리네요.. ;;
이유가 뭔지... ;; 어떤 부분을 더 공부해야 될까요? ;;
아래는 소스입니다.
#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);
}
}
}
음 ..
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 』
댓글 달기