到目前为止,在链表中,我只使用了一个temp
节点来遍历不同操作数的给定链表,这非常容易。
现在,一本书的作业需要编写一个 C 代码,其中用户输入将是列表中的一个数字,我们必须比较给定数字之前的数字和给定数字之后的数字,并判断哪个更大或相等,以防万一。为此,据我说,我们需要两个指针,即。 prev
和next
节点的两侧current
指向不同节点上的两个数字,然后收集数据部分,我们可以比较它们。但是我不能用 C 语言编写这部分。因此,指向所需节点的代码片段会有所帮助。
你不需要上一个指针。你只需要一个临时变量来跟踪上一个和当前节点,如下所示:
prevNode = NULL;
curNode = *p;
while (curNode != NULL)
{
prevNode = curNode;
curNode = curNode->next;
}
一旦找到要进行比较的位置,就可以使用 prevNode 的数据、curNode 的数据和 curNode->next 的数据。希望这有帮助。
有两种方法可以做到这一点。
-
使用双向链表
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; }
-
单链表
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; }