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