2

これまで、Linked List では、1 つのtempノードのみを使用して、さまざまな操作のために特定のリンク リストを走査していましたが、これは非常に簡単でした。

ここで、本の割り当てでは、ユーザー入力がリスト内の数値になる C コードを記述する必要があり、指定された数値の直前の数値と直後の数値を比較して、どちらが大きいかを判断する必要があります。場合によっては等しい。そのためには、私によると、2 つのポインターが必要です。prevノードのnext両側currentで、異なるノードの2つの数値を指し、そこでデータ部分を収集してそれらを比較できます。しかし、この部分を C でコーディングすることはできません。そのため、必要なノードを指すコード スニペットが役立ちます。

4

2 に答える 2

5

前のポインターは必要ありません。次のように、前のノードと現在のノードを追跡するために一時変数が必要です。

prevNode = NULL;
curNode = *p;

while (curNode != NULL)  
{
  prevNode = curNode;
  curNode = curNode->next;
}

比較したい場所が見つかったら、prevNode のデータ、curNode のデータ、および curNode->next のデータを使用できます。お役に立てれば。

于 2013-09-12T16:16:20.957 に答える
1

これには 2 つの方法があります。

  1. 双方向リンク リストを使用する

    typedef struct node {
        struct node *prev, next;
        int data;
    } node_t;
    
    /*
     * Return 1 if prev data is greater then next data, else 0.
     * return -1 if invalid input.
     */
    int compare(node_t *head, int num)
    {
        node_t *p;
    
        if (head == NULL || head->data == num || head->next == NULL)
           return -1;
    
        p = head->next;
    
        while (p->next != NULL) {
            if (p->data == num) {      
                return (p->prev->data > p->next->data ? 1 : 0);
            }
            p = p->next;
        }
    
        return -1;
    }
    
  2. 単方向リスト

    typedef struct node {
        struct node *next;
        int data;
    } node_t;
    
    /*
     * Return 1 if prev data is greater then next data, else 0.
     * return -1 if invalid input.
     */
    int compare(node_t *head, int num)
    {
        node_t *p, *q;
    
        if (head == NULL || head->data == num || head->next == NULL)
           return -1;
    
        p = head;
        q = head->next;
    
        while (q->next != NULL) {
            if (q->data == num) {      
                return (p->data > q->next->data ? 1 : 0);
            }
            p = q;
            q = q->next;
        }
    
        return -1;
    }
    
于 2013-09-12T16:40:25.147 に答える