C语言指针五——指针应用:链表
——从代码猜测作者的意图毕竟是一件痛苦的事,这也是为什么许多人接手别人的项目宁愿从头做起也不愿意使用现有代码的原因。
链表是一种重要的数据结构,它是许多其他数组结构的和算法的基础,其重要性不言而喻。对于新手来说,它的确是学习C语言的一道关卡——希望你不要被它所吓倒,从而失去对编程的兴趣。
要先学习链表,必先要学习C语言的结构,有了它,我们可以将学生也定义也一个C语言的数据类型。看如下的代码:
#include
struct student
{
char *name;//学生的姓名
int age;//学生的年龄
char *id;//学生的学号
};
void PrintStudent(studentstu)
{
printf_s("学生的姓名为:%s,学生的年龄为:%d,学生的学号为:%s\n", stu.name, stu.age,stu.id);
}
int main()
{
student stu;
stu.name = "汪星人";
stu.age = 18;
stu.id = "12110031";
PrintStudent(stu);
return 0;
}
上面的代码定义了一个结构student,并且定义了一个函数打印student变量。可以看到student结构中包含了学生的姓名-年龄-学号数组,此后,结构student就可以当作一个C语言的数组类型来使用了。在main函数里,声明了一个student类型的变量stu,并且对stu里面的成员进行了赋值,最后打印了stu变量里的内容。
链表是如下所示的数组结构:
这里每一个大长方形代表一个结构,箭头表示指针,那么上面表达的意思就是在结构的数据成员里,有一个指针项,这个指针会指向一个结构,如此,多个结构就构成了一个链表。
定义一个拥有指针的数据结构,只需要稍微修改一下上面的结构:
struct student
{
char *name;//学生的姓名
int age;//学生的年龄
char *id;//学生的学号
struct student *next;//指向结构student类型的指针
};
上面的声明中,next是一个指向结构student的指针,它不能指向其他的结构或者其他的数据类型。
链表的每一个项称作结点,构造一个具有3个结点的链表:
每一结点的next项指向下一个链表的结点,第一个结点称作表头(head),这样我们就可以通过表头来遍历整个链表了,最后的结点的next项指向NULL表示那个是这个链表的尾(最后一项)。
手工创建上图的链表,代码如下