-1

入力がリンクリストへのポインターであるリンクリスト内のノードを削除する関数を作成していました。関数がノードを 1 つしか持たないリンク リストを削除する場合、関数はポインターを NULL を指すようにします。コードの一部を次に示します。

void remove(dlinkNode_t *start){
    //some previous code
    if(start->next==NULL){//meaning we're removing the head of the linked list
        dlinkNode_t current=start;  //get a temp pointer to point at this node
        start=NULL;    //make start point to null
        free(current); //free the head
        return;
    }
    // More code

メインでは、1 つのノードでリンク リストを作成し、このリンク リストを remove 関数に渡して解放しました。コードは次のとおりです。

int main(){
    dlinkNode_t *node1=create();  //creates a node and make node1 point at it
    remove(node1);  //now node1 should point at NULL
    if(node1==NULL)
        printf("hi");
    return 0;
}

しかし、こんにちはが印刷されているのを見ませんでした。if 文が通らなかった理由がわかりません。何か案は?

4

1 に答える 1

3

ポインタの新しいコピーが のローカル スコープで作成されますremove。ポインターに加えた変更は、そのスコープでのみ表示されます。ポインターが指す値を変更すると、呼び出し元のスコープに戻ります。

この問題は、次の 2 つの方法のいずれかで解決できます。

  • 編集されたポインターを返す

    node1 = remove(node1); 
    

    remove にも変更を加えます。

    dlinkNode_t * remove(dlinkNode_t *start){
        //some previous code
        //Function code
        return start;
    
  • または、ポインター start にポインターを渡してから、そのポインターを操作することもできます。

    関数呼び出し:

    remove(&node1);
    

    関数定義:

    void remove(dlinkNode_t **start){
        //some previous code
        if((*start)->next==NULL){ // meaning we're removing 
                                  // the head of the linked list
            dlinkNode_t current=**start; //get a temp pointer
                                         // to point at this node
            **start=NULL;  //make start point to null
            free(current); //free the head
    
于 2013-01-27T03:08:32.563 に答える