2

到目前为止,在链表中,我只使用单个temp节点来遍历给定链表以进行不同的操作,这非常容易。

现在一本书的作业要求编写一个 C 代码,其中用户输入将是列表中的一个数字,我们必须比较给定数字之前的数字和给定数字之后的数字,并判断哪个更大或相等,以防万一。为此,据我说,我们需要两个指针,即。prevnext在节点的两侧current指向不同节点上的两个数字,然后收集那里的数据部分,我们可以比较它们。但我无法用 C 语言编写这部分代码。因此,一个指向所需节点的代码片段会很有帮助。

4

2 回答 2

5

您不需要 prev 指针。您只需要一个临时变量来跟踪前一个和当前节点,如下所示:

prevNode = NULL;
curNode = *p;

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

一旦找到要进行比较的位置,就可以使用 prevNode 的数据、curNode 的数据和 curNode->next 的数据。希望这可以帮助。

于 2013-09-12T16:16:20.957 回答
1

有两种方法可以做到这一点。

  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 回答