5.5.4 链表的遍历和查找

    链表的结构相对而言比较特殊,在对链表中的节点进行访问和查找的时候,必须从链表的头节点开始,按照链表节点指针域所指的顺序逐个查找节点,直到找到为止。同对数组元素的访问一样,利用循环结构对链表节点进行遍历是一种常用的方法,代码5.8中使用的就是while循环结构,循环的终止条件便是判断next指针是否为NULL,即是否已经到达了最终节点。

    举例而言,对代码5.8创建的链表,想要知道name成员为“Deco”的节点中age成员的值,通过代码5.9可以完成该功能。

    代码5.9 链表的遍历和查找ListOperation


    <———————————-文件名:example509.cpp———————————————-> 01 #include<iostream> 02 #include<string> 03 struct student//定义结构student 04 { 05 char name[20]; 06 int age; 07 student*next;//指向下一个元素的指针 08 }; 09 int main() 10 { 11 using namespace std; 12 student c={"Kaka",23,NULL};//声明末尾结构变量,指向为NULL 13 student b={"Deco",27,&c};//声明c之前结构变量b,&c为b.next初始化 14 student a={"Terry",30,&b};//申明b之前结构变量a,&b为a.next初始化 15 student*head=&a;//头指针,指向a 16 student*pointer=head;//使用指针pointer访问链表中的元素 17 bool isFind=false;//设置标志,bool型变量isFind 18 //从头到尾遍历链表,当到达末尾时pointer等于NULL,退出for循环 19 for(;pointer;pointer=(*pointer). next) 20 { 21 if(strcmp("Deco",(*pointer). name)==0)//看元素中name成员是否为Deco 22 { 23 cout<<"Deco's age:"<<(*pointer). age<<endl;//如果有此项,输出年龄 24 isFind=true;//设置标志为true 25 break;//跳出for结构 26 } 27 } 28 if(!isFind) 29 { 30 cout<<"没有找到该项"<<endl; 31 } 32 return 0; 33 }

    输出结果如下所示。


    Deco's age:27

    【代码解析】为了和代码5.8有所区分,我们利用了for循环结构对链表进行了遍历查找,代码第21行,应用C风格字符串处理函数strcmp()判断节点结构的成员变量name(字符数组)是否和“Deco”一致,如果一致证明已经找到所需数据,用“break;”语句跳出循环,否则,将下一节点的指针赋给pointer,继续查找,直到到达链表的最终节点,此时,pointer指针的值为NULL,for循环测试条件不满足,遍历结束。