2014-02-28 2 views
0

나는 링크 된 목록에 초보자입니다. 나는 링크의 크기를 터미널에서 취한 후 모든 데이터를 freq에 보관할 수있는 상황을 가지고 있습니다 (내 코드에서 "freq"이지만 일반적으로 data/info라고 함). 그리고이를 사용하여 연결된 목록을 만듭니다. .링크 된 목록의 다른 노드를 연결하고 그것을 트래버스하는 방법

내가 지금까지해온 코드는 작성 될 LL의 크기를 읽고 입력 된 각 데이터에 대한 노드를 만드는 코드에 아래에 나와 있습니다. 이제 어떻게 요소가 처음에 다른 노드가 NULL을 가질지를 가리 키도록 노드를 연결해야합니다. 지금은 각 노드의 다음에 NULL이 있습니다.

#include<stdio.h> 
#include<stdlib.h> 
#include<malloc.h> 
#include <string.h> 

struct node 
{ 
int freq; 
struct node *next; 
}; 
typedef struct node node; 
node *tree=NULL; 

main() 
{ 
int size,data; 

printf("enter the size of node\n"); 
scanf("%d", &size); 
printf("start entering the number of elements until your size\n"); 
node *prev; 
node *temp; 
prev = NULL; 
do 
{ 
scanf("%d\n", &data); 

temp = (node*)malloc(sizeof(node)); 
temp->freq=data; 
temp->next=NULL; 
if (prev) 
    prev->next = temp; 
else 
    tree = temp; 
prev = temp; 
size--; 
} 
while(size>0); 

node *temp1; 
temp1=temp; 
while(temp1->next!=NULL) 
{ 
    printf("%d-> ",temp->freq); 
    temp1=temp1->next; 
} 
} 

케 (1) :

여기 내 코드는 내가 터미널에서 촬영이 노드를 연결하는 시도했지만 여전히 이송 된 링크 목록을 인쇄하지 않습니다. 어디에 문제가 있습니까?

The output is: 
[email protected]:~/Desktop/Internship_Xav/Huf_pointer$ ./ll 
enter the size of node 
4 
start entering the number of elements until your size 
22 
11 
4 
5 
6//It don't print the linked list here 
[email protected]:~/Desktop/Internship_Xav/Huf_pointer$ 

답변

1

당신은 당신이 새로운 노드로 이전 노드 next 필드 지점을 할 수 있도록, 이전 반복에서 추가 한 노드를 추적해야합니다. 이런 식으로 뭔가 : 첫 번째 반복에서,이 새로 할당 된 노드에 tree을 설정할 것

printf("start entering the number of elements until your size\n"); 
node *prev; 
prev = NULL; 
do 
{ 
scanf("%d\n", &data); 
node *temp; 
temp = (node*)malloc(sizeof(node)); 
temp->freq=data; 
temp->next=NULL; 
if (prev) 
    prev->next = temp; 
else 
    tree = temp; 
prev = temp; 
size--; 
} 
while(size>0); 

참고. 목록을 만든 후 트래버스하려면이 작업이 필요합니다. 루프가 끝날 때까지 head은 첫 번째 요소를 가리키고 마지막 요소의 nextNULL을 가리 킵니다.

네, 목록을 통과하는 귀하의 접근 방식은 정확합니다.

UPDATE

당신이 목록이 올바른지 통과 할 설명하지만 제대로 구현하지 않은 접근 방식.

temp이 아니라 목록 머리글에서 시작하려는 경우 temp이 할당 한 마지막 노드이기 때문입니다. 그리고 조건이 while (temp1->next != NULL)이 아닌 경우 temp1이 마지막 노드이므로 마지막 노드의 next 필드가 항상 NULL을 가리키기 때문에 루프가 실행되지 않습니다.

대신이 당신이 원하는 무엇인가 : printf()의 인수는 또한 temp->freq를 전달하고, 변경된 것을

node *temp1; 
temp1 = tree; 
while(temp1 != NULL) 
{ 
    printf("%d-> ", temp1->freq); 
    temp1 = temp1->next; 
} 

주, 올바른 변수는 temp1->freq이 될 것입니다.

+0

감사합니다. 적용 해 보겠습니다. 그럼 내가 너에게 돌아올거야.:) – Sss

+0

나는이 줄을 다시 설명 할 수있는 줄을 이해할 수 없었다. "(이전) prev-> next = temp; else tree = temp; prev = temp;" 또한 "prev"노드를 사용해야하는 이유는 무엇입니까? – Sss

+0

@ user234839'tree'에 대한 초기화를 제공합니다. 'if (prev)'는 "이것이 우리가 여기 처음있는 것이 아닌 경우"를 의미합니다. - 그 경우 이전 노드'next' (즉'prev-> next ')를 새로운 노드로 업데이트합니다. 'temp'). 그렇지 않으면 ('prev'는 NULL을 처음으로 쓰는 것입니다.)'tree'를'temp'로 초기화합니다. 왜냐하면 이것은 목록의 머리가 될 것이기 때문입니다. 그리고 나서, 어느 경우 든, 우리는 항상'prev = temp;'를 실행합니다. 왜냐하면'temp'가 이제 다음 반복의 이전 노드이기 때문입니다. 'prev = temp;'는 다음 반복을위한 코드를 준비합니다. –

0

그냥 이전 노드를 추적하여 다음 노드와 연결하십시오.

node *temp,*temp2=NULL,*head; 
do 
{ 
scanf("%d", &data); 

temp = (node*)malloc(sizeof(node)); 
if (temp2==NULL) 
    head=temp; 
else 
    temp2->next=temp; 

temp->freq=data; 
temp->next=NULL; 
temp2=temp; 

size--; 
}while(size>0); 

head은 연결된 목록의 시작 노드를 제공합니다.

또한 scanf("%d\n", &data); 대신 scanf("%d", &data);이 필요합니다. this answer을 참조하십시오.

+0

Downvote why ??? –

+0

아니지만, 아마도 첫 번째 대답이 작동하지 않았기 때문일 수 있습니다. 그리고 당신은'while (size> 0);을 놓쳤습니다. –

+0

@RikayanBandyopadhyay, 나는 코드를 편집했습니다. 여전히 연결된 목록을 트래버스하지 않습니다. 출력을 보면 데이터를 읽고 코드에서 벗어납니다. 어떤 도움을 주시겠습니까? – Sss

관련 문제