2

私はリンクされたリストを持っています。今、それを見ていきたいと思います。それを進めるたびに、次のように現在のノードをリストの先頭に移動します:

4 5 3 2 7
5 4 3 2 7
3 5 4 2 7
2 3 5 4 7
7 2 3 5 4

コード:

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

typedef struct _node {
    int p;
    struct _node *next;
} node;

main(int argc, char **argv)
{
    int i, n;
    node *nod = NULL;
    node *nod2 = NULL;
    node *nod_tmp = NULL;

    node *nod_next = NULL;
    node *nod_before = NULL;

    printf("Enter n: ");
    scanf("%d", &n);
    for(i = 0; i < n; ++i)
    {
        nod_tmp = (node *)malloc(sizeof(node));
        scanf("%d", &nod_tmp->p);
        if (i == 0)
        {
            nod = nod2 = nod_tmp;
        }
        nod2->next = nod_tmp;
        nod2 = nod_tmp;
    }

    nod_tmp = nod;
    while (nod_tmp->next != NULL)
    {
        nod_before = nod_tmp; // save current node
        nod_next = nod_tmp->next->next; // save next node
        nod_before->next = nod_next; // link the previous with the next one
        nod_tmp->next = nod; // point the current node to the beginning of list
    }

    while(nod != NULL)
    {   
        printf("%d\n", nod->p);
        nod = nod->next;
    }
    return 0;
}   
4

4 に答える 4

2
nod_tmp = nod->next;
nod_before= nod;
while (nod_tmp != NULL)
{
     nod_before->next = nod_tmp->next;
     nod_tmp->next = nod;
     nod = nod_tmp;
     nod_tmp = nod_before->next;
}

2 番目のループを上のこのループに変更します。node_tmphead の後の 2 番目のノードをnod_before指し、最初のノードを指すことに注意してください。このようにして、無限ループを回避します。

于 2013-01-08T14:30:12.060 に答える
2

リストを反転する while ループが実際に何をしているのかを真剣に考えてください。たとえば、次のリストがあるとします。

1 --> 2 --> 3 -->null

while ループ コードを見てみましょう。

nod_tmp = nod; // nod and nod_tmp now point to 1
while (nod_tmp->next != NULL)
{
    nod_before = nod_tmp; // nod_before, nod_tmp, and nod all point to 1
    nod_next = nod_tmp->next->next; // nod_next points to 3
    nod_before->next = nod_next; // 1-->3 
    nod_tmp->next = nod; // 1-->1
}

最初のノード (まだ nod_tmp によって参照されている) は、それ自体を指すようになりました。これにより、while 条件が無限にスピンするだけでなく、リスト内の残りのメモリがリークされます。

于 2013-01-08T14:12:48.467 に答える
0
#include <stdio.h>
#include <stdlib.h>

typedef struct _node {
    int p;
    struct _node *next;
} node;

main(int argc, char **argv)
{
    int i, n;
    node *nod = NULL;
    node *nod2 = NULL; //header of the linked list
    node *nod_tmp = NULL;

    printf("Enter n: ");
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        nod_tmp = (node *)malloc(sizeof(node));
        scanf("%d", &nod_tmp->p);
        nod_tmp->next = nod2;
        nod2 = nod_tmp;
    }

    nod = nod2;

    printf("Linked list order before reversing:  ");
    while(nod != NULL)
    {   
        printf("%d  ", nod->p);
        nod = nod->next;
    }
    printf("\n");

    nod = nod2;
    while (nod!=NULL && nod->next != NULL)
    {
        nod_tmp = nod2;
        nod2 = nod->next;
        nod->next = nod2->next;
        nod2->next = nod_tmp;
    }

    nod = nod2;

    printf("Linked list order after reversing:  ");
    while(nod != NULL)
    {   
        printf("%d ", nod->p);
        nod = nod->next;
    }
    printf("\n");
    return 0;
}   
于 2013-01-08T14:49:55.170 に答える
0

ここで無限ループ:

while (nod_tmp->next != NULL)
    {
        nod_before = nod_tmp; // save current node
        nod_next = nod_tmp->next->next; // save next node
        nod_before->next = nod_next; // link the previous with the next one
        nod_tmp->next = nod; // point the current node to the beginning of list
    }
于 2013-01-08T14:06:15.073 に答える