-1

// 変数

typedef struct node 
 { 
    int value; 
    struct node *next; 
 }mynode;

// グローバル (必須ではありません)。

mynode *head, *tail, *temp; 

// 機能

void add(int value);

// リンクされたリストに新しいノードを追加する関数

 void add(int value)
 {
    temp = (mynode *) malloc(sizeof(struct node));
    temp->next=(mynode *)0;
    temp->value=value;

    if(head==(mynode *)0)
    {
       head=temp;
       tail=temp;
    }
    else
    {
      tail->next=temp;
      tail=temp;
    }
 }

// main() 関数

int main()
 {
     head=(mynode *)0;

     // Construct the linked list.
     add(1);
     add(2);
     add(3);

     return(0);
 }

値が 3(前述のコードで見られる最後のノード) であるノードへのポインターしかない場合、それを削除して、値が 2(前述のコード) であるノードを最後のノードとして作成できますか。

4

5 に答える 5

1

いいえ、しかし、何をしているのかわかっている場合は、最後のノードをインプレースで変更できます。最後のノードを削除するには、最後から 2 番目のノードへのアクセス、特に最後のノードへのリンクが必要です。

于 2012-02-15T05:28:36.850 に答える
0

双方向リンク リストを使用して、前のノードにアクセスできます。または、リスト全体を繰り返します。

于 2012-06-01T20:01:01.373 に答える
0

答えはノーだ。

最後のノードへのポインターを呼び出すことができますfreeが、それは、そのノードが占有していたメモリが要求されなくなったことを意味します。ほとんどの場合、データはしばらく変更されずにそのまま残ります。つまり、最後から 2 番目のノードのそれへのポインターは、有効であってはならないにもかかわらず、有効であることを意味します。

リストにとって意味のある方法でノードを削除するには、最後から 2 番目のノードに含まれるポインターを無効にする必要があります。そして、最後から 2 番目のノードへの直接ポインターによって、または前のノードからリストをトラバースすることによって、その最後から 2 番目のノードにアクセスできない限り、これを行うことはできません。

于 2012-02-15T06:10:26.040 に答える
0

はい、できます..次のコードを試してください。

void deleteNode()
{
    mynode *temp1;
    for(temp1 = head; temp->next!= tail; temp1 = temp1->next);
    tail = temp1;
    free(tail->next);
}

最後のノードを削除します。

于 2012-02-15T05:30:08.133 に答える