2013-07-19 3 views
2

그래서 이것은 연결 목록 프로그램에 대한 제 코드입니다. 나는 그렇게 위대하지 않다는 것을 알고 있지만 작동한다. ins() 함수를 변경하여 새 요소가 크기에 따라 목록에 삽입되도록합니다. 즉, 목록의 마지막 노드는 가장 큰 정수를 포함하고 가장 작은 것은 첫 번째입니다. 정수는 텍스트 파일에서 읽어 들이며, main()에서 볼 수 있듯이 텍스트 파일의 INSERT 및 REMOVE 명령은 목록에 삽입 (다음 줄의 다음 정수) 명령으로 해석되거나 목록에서 요소를 제거하십시오. 기존 코드로 어떻게 할 수 있습니까? 내 ins() 함수를 수정하려고했지만 목록이 올바르게 정렬되지 않았습니다.이 링크 된 목록에 노드를 삽입하는 가장 좋은 방법은 무엇입니까?

ins() 기능에
#include <stdio.h> 
#include <stdlib.h> 

struct node { 
    int number; 
    struct node *next; 
}; 

/* prototypes */ 

void ins(struct node *llist, int number); 
void rem(struct node *llist); 
void sho(struct node *llist); 

int main(void) 
{ 
    int number; 
    char command[6]; 
    struct node *llist; 
    struct node *root; 

    llist = (struct node *)malloc(sizeof(struct node)); 
    llist->number = 0; 
    llist->next = NULL; 

    root = llist; 

    printf("addr: \n\n%p,%p\n\n", &llist, &root); 

    FILE *file; 
    file = fopen("a3data.txt", "r"); 

    if (file == NULL) 
    { 
     printf("\n----------------------------------------\n"); 
     printf("| Error. Did not read file. Exiting. |\n"); 
     printf("----------------------------------------\n\n"); 
     exit(1); 
    } 
    else 
    { 
     while ((fscanf(file, "%s", command)) != EOF) 
     { 
      if((strcmp(command, "INSERT"))==0) 
       { 
        fscanf(file, "%d", &number); 
        printf("\nINSERT   ", number); 
        ins(llist, number); 
        sho(llist); 
       } 
      else if((strcmp(command, "REMOVE"))==0) 
       { 
        printf("\n   REMOVE ");     
        rem(llist); 
        sho(llist); 
       } 
     } 
    } 

    printf("\n"); 
    free(llist); 
    return(0); 
} 

void ins(struct node *llist, int number) 
{ 
    while(llist->next != NULL) 
    { 
     llist = llist->next; 
    } 

    llist->next = (struct node *)malloc(sizeof(struct node)); 
    llist->next->number = number; 
    llist->next->next = NULL; 
} 

void rem(struct node *llist) 
{ 
    while(llist->next->next != NULL) 
    { 
     llist = llist->next; 
    } 

    llist->next = NULL; 
} 

void sho(struct node *llist) 
{ 
    while(llist->next != NULL) 
    { 
     printf("%d ", llist->number); 
     llist = llist->next; 
    } 

    printf("%d", llist->number); 
} 
+0

그래서 당신은 정렬 된 순서로 노드를 삽입해야합니다 귀하의 경우 기능을 수정? hmm –

+0

제대로 작동합니까, 나는'struct node * llist'가'struct node ** llist'이어야한다고 생각합니다. 그렇지 않으면 호출시 효과가 없습니다 –

+0

['void sortedInsert (struct node ** head_ref, struct node * new_node)'] (http://www.geeksforgeeks.org/given-a-linked-list-which-is-sorted-how-will-you-insert-in-sorted-way/) –

답변

0

void ins(struct node *llist, int number) 
{ 
    struct node *llist1; 
    while(llist->next != NULL) 
    { 
    if (llist->next->number > number) 
     break; 
    llist = llist->next; 
    } 

    llist1 = (struct node *)malloc(sizeof(struct node)); 
    llist1->number = number; 
    llist1->next = llist->next; 
    llist->next = llist1; 
} 
+0

완벽한! 이해 했어! 할 수 있으면 점수를 주겠다.하지만 충분한 인력이 없다. –

0

, 대신

while(llist->next != NULL) 

사용

while((llist->next != NULL) && (llist->number < number)) 

이 자체를 삽입하는 동안 정렬하는 데 도움이 될 것입니다.

또한 rem() 함수에서 동적으로 할당하는 메모리를 확보해야합니다.

+0

아, 고맙습니다. . 나는 그 기억을 풀어 주겠다. –

0

삽입물은 단순히 꼬리에 요소를 추가하는 것입니다. 노드의 현재 값 (list-> number)과 삽입 할 숫자를 비교하는 코드를 작성해야합니다. 현재 값이 삽입 할 숫자보다 큰 경우 현재 노드 앞에 번호를 삽입해야합니다. 이를 위해 이전 포인터도 유지해야합니다. 필자가 작성한 코드는 논리를 이해하기위한 것일뿐 정확성을 검사하지 않았습니다.

if(llist->number > innumber) { 
    node *newNode = (struct node *)malloc(sizeof(struct node); 
    newNode->number = innumber; 
    prevPointer->next = newNode; 
    newNode->next = llist; 
} 
+0

감사합니다. 할 일이 무엇인지 이해하는 데 도움이됩니다. –

관련 문제