我知道如何使用指针指向其他对象(如数组),但在知道如何在链表中使用它们的方案中,我很困惑。例如:
struct node {
int info;
struct node *next;
}
typedef struct node Node
并假设稍后在程序中,dataList被设置为列表的第一个节点的地址,该列表按以下顺序保存这些数据:25,30,45,60,65,80,90
我要编写C语句,将ptr1设置为保存45的节点的地址,并将ptr2设置为保存80的节点的地址。
鉴于dataList最初是列表的头部,我的想法是:
ptr1= dataList.next.next
但我确定格式不正确或我也认为
ptr1->next->next
可能是对的, 但是,我不确定。
答案 0 :(得分:2)
ptr1->next
相当于(*ptr1).next
,即它从next
指向的结构中获取名为ptr1
的成员。
结构解除引用(“对象的成员b指向”)a->b
答案 1 :(得分:1)
正如您所说,dataList
,ptr1
和ptr2
是指向struct node的指针。所以它应该是ptr1 = dataList->next->next
。 ->
只是指向引用它指向的struct成员的指针的快捷方式。
答案 2 :(得分:1)
dataList是保存列表起始地址的那个。所以你使用dataList变量访问它们。您使用->next->next
指向45的想法是正确的,它应该是ptr1 = dataList->next->next
,但我们不会全面执行->next->next->next...
来获取每个元素,而是使用指针来保持每个下一个地址和循环,直到我们得到所需的价值。
答案 3 :(得分:0)
执行next->next->next
会有效,但这不是我们想要通过链接列表实现的目标。在遍历时比较每个节点的info
,并将ptr1
和prt2
指向要指向的节点。下面给出了一个示例代码。
if ( dataList != 0 ) {
while ( dataList->next != 0)
{
dataList = dataList->next;
if (dataList->info == 25 ) {
ptr1 = dataList;
}
if (dataList->info == 80 ) {
ptr2 = dataList;
}
}
}
答案 4 :(得分:0)
假设dataList的以下声明
struct node anode1, anode2, anode3, anode4, anode5, anode6, anode7;
struct node *dataList = &anode1;
anode1.info = 25;
anode1.next = &anode2;
anode2.info = 30;
anode2.next = &anode3;
anode3.info = 45;
anode3.next = &anode4;
anode4.info = 60;
anode4.next = &anode5;
anode5.info = 65;
anode5.next = &anode6;
anode6.info = 80;
anode6.next = &anode7;
anode7.info = 90;
anode7.next = NULL;
printf("Third node = %d\n", dataList->next->next->info); // prints 45
printf("Sixth node = %d\n", dataList->next->next->next->next->next->info); // prints 80