>

이 간단한 프로그램에서 list로 작업하고 있지만 포인터를 전달하는 데 나쁜 시간을 보내고 있습니다.

학생들을위한 구조체가 있다고 가정합시다

typedef struct student{
    char lastname[50];
    int age;
    int std_id;
    struct student * next;
    struct student * prev;
}stdn;

그리고 수업을위한 또 다른 구조체가 있습니다

typedef struct class{
    char class_id[3];
    struct class * next;
    struct class * prev;
    struct student * stdn_list;
}clss;

기본적으로이 목록에는 수업이 있으며 각 수업에는 학생과 함께 하위 목록이 있습니다.

여기에 클래스리스트를 생성하는 함수가 있습니다!

void create_class_list(clss ** root, clss * node){
    clss * root_aux;
    if(!(*root)){
        (*root) = node;
    }
    else{
        root_aux = (*root);
        while(root_aux->next != NULL){
            root_aux = root_aux->next;
        }
        node->prev = root_aux;
        root_aux->next = node;
    }
}

문제는 클래스 목록의 각 노드에서 하위 목록으로 작업해야 할 때입니다.

여기서 하위 목록 작성을 담당하는 기능이 있습니다.

   void assign_student(clss ** root, stdn * node, char * class_id){
        clss * root_aux;
        stdn * stdn_aux;
        root_aux = (*root);
        while(root_aux != NULL){
            if(strcmp(root_aux->class_id,class_id) == 0) 
                break;
            root_aux = root_aux->next;
        }
        if(root_aux != NULL){
            if(root_aux->stdn_list == NULL){
                root_aux->stdn_list = node;
            }
            else{
                stdn_aux = root_aux->stdn_list;
                while(stdn_aux->next != NULL){
                    stdn_aux = stdn_aux->next;
                }
                node->prev = stdn_aux;
                stdn_aux->next = node;
            }
        }
    }

기본적으로이 기능은 특정 수업을 찾고 해당 수업에 학생을 추가합니다.

제 문제는 학생을 삭제하거나 bubblesort와 같은 알고리즘을 사용하여 목록을 정렬하려는 경우에 학생을 삭제하는 함수의 예입니다.

void delete_student(clss ** root, int stdn_id){
    clss * root_aux;
    stdn * stdn_aux;
    stdn * temp;
    int deleted=0;
    root_aux = (*root);
    while(root_aux != NULL){
        stdn_aux = root_aux->stdn_list;
        //try with root first//
        if(stdn_aux->std_id == stdn_id){
            temp = stdn_aux;
            stdn_aux = stdn_aux->next;
            stdn_aux->prev = NULL;
            free(temp);
            deleted = 1;
        }
        //if the student isn't the root
        if(deleted == 0){
            stdn_aux = stdn_aux->next;
            while(stdn_aux != NULL){
                if(stdn_aux->std_id == stdn_id){
                    temp = stdn_aux;
                    //link the prev element with the next element
                    stdn_aux->prev->next = stdn_aux->next;
                    //link the next element with the prev element
                    stdn_aux->next->prev = stdn_aux->prev;
                    stdn_aux = stdn_aux->next;
                    free(temp);
                    deleted = 1;
                    break;
                }
                stdn_aux = stdn_aux->next;
            }
        } 
        if(deleted == 1){
            break;
        }
        root_aux = root_aux->next;
    }
}

함수는 목록에서 요소를 삭제하지 않는 것처럼 보이며 포인터를 함수에 전달하는 방법 또는 목록을 처음 생성하는 방법과 관련이 있는지 확실하지 않습니다.

  • 답변 # 1

    학생 목록의 머리에있는 학생 노드를 삭제할 때는 현재 가리키는 노드를 삭제할 때 root_aux->stdn_list에 다시 할당해야합니다. 그렇기 때문에 학생 노드를 삭제하지 않는 것이 좋습니다.

    root_aux->stdn_list = stdn_aux->next;
    
    

    처리와 관련하여 프로그램이 코어 덤핑을 방지하기 위해 if 문으로 싸야하는 다른 문제가 있습니다 :

    학생 목록 처리를 시작하기 전에 먼저 학생 목록이 있는지 확인해야합니다. 즉, 학생 목록 (root_aux->stdn_list)을 가리키는 클래스 변수가 NULL이 아닌지 확인하십시오.

    다음 명령문을 수행하기 전에 stdn_aux->next가 NULL이 아닌지 확인하십시오. 즉, 삭제중인 루트 노드 이외의 항목이 있습니다.

    stdn_aux = stdn_aux->next;
    stdn_aux->prev = NULL;
    
    

    할당하기 전에

    stdn_aux->next->prev = stdn_aux->prev;
    
    

    학생 목록의 마지막 노드이므로 stdn_aux->next가 null이 아닌지 확인하십시오.

  • 이전 php - 2 배열을 어떻게 그룹화 할 수 있습니까?
  • 다음 html - 섹션 태그 사이의 공백을 제거하는 방법