在链表中使用指针

时间:2014-03-04 06:21:41

标签: c pointers

我知道如何使用指针指向其他对象(如数组),但在知道如何在链表中使用它们的方案中,我很困惑。例如:

 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 

可能是对的, 但是,我不确定。

5 个答案:

答案 0 :(得分:2)

ptr1->next相当于(*ptr1).next,即它从next指向的结构中获取名为ptr1的成员。

结构解除引用(“对象的成员b指向”)a->b

答案 1 :(得分:1)

正如您所说,dataListptr1ptr2是指向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,并将ptr1prt2指向要指向的节点。下面给出了一个示例代码。

PS:我只是个初学者,如果我错了,请纠正我。

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