时间:2019年3月7日。

链表是众多数据结构中的较为基础且易于理解的一种,有链表衍生出来的数据结构众多,如堆,栈,队列等等。

而链表则是由最基础的结构体演变而来,当然结构体主要是为了数据更好的存储而诞生的一种数据类型,我们知道结构体是可以由多种数据类型,共同联合集成而形成的一种自定义的数据类型,并且结构体类的中可使用多种系统数据类型没有限制,并且数据之间基本都有逻辑上的关系,从而结构体便形成了得天独厚的存储优势,但是随着数据的不短增多,对磁盘空间运用的更加高效,对数据的存储更加灵活,链表这种数据结构,就显得非常重要,特别是对规模较大的程序而言,链表更是不二之选(当然堆,栈,队列也是很常用)。

当然为了能更好的学会使用堆,栈,队列等,学习链表是必不可少的。万丈高楼平地起,我们学习语言的任何一种语法都是从静态到动态,从限制到自由的一个过程,链表也不例外。

链表-静态链表

链表是本质上是结构体。
#include<stdio.h>
struct Date{
 int i;
};
int main(){
 struct Date stu1;
 printf("ADD DATE\n");
 sacnf("%d",&stu1.Date);
 printf("%d",stu1.Date);
  return 0;
}

一个简单的结构体只需要去简单的定义便可以得到一个存储数据的结构,

当我们像存储多个相同的数据且可以快数引用的结构体时,我们有多种选择

一、
 #include<stdio.h>
 struct Date{
   int i;
 };
 int main(){
   struct Date stu1,stu2;
    printf("ADD DATE\n");
    sacnf("%d",&stu1.Date);
    sacnf("%d",&stu2.Date);
    printf("%d",stu1.Date);
    printf("%d",stu2.Date);
     return 0;
 }

当然多定义几个结构体也是可以的,但是我们现在讲的是静态链表,那我们用连表怎么实现呢?

二、
 #include<stdio.h>
 struct Date{
   int i;
   struct Date *next;
 };
 int main(){
   struct Date stu1,stu2,*head,*end;
    printf("ADD DATE\n");
    sacnf("%d",&stu1.Date);
    sacnf("%d",&stu2.Date);
    head=&stu1;
    stu1.next=&stu2;
    stu2.next=NULL;
    end=head;
    while(end!=NULL){
    printf("%d",end->i);
    end=end->next;
}
     return 0;
}

从静态链表中我们发现,链表里面多了指针,我们知道指针是储存某种数据类型地址的一种变量(当然指针也有常量需要用const修饰),我们通常说储存地址时称指针指向了某个地方,当然指针要直指向某种数据,就必须要把这个指针定义成和该数据相同的数据类型的指针,在Date结构体里面我们发现我们有个”struct Date“类型的指针,这也可以解释结构体的类型是有程序编写者自己定义的。回到正题,我们肯定疑问这个指针有什么用,我们继续往下看,在主函数里面,我们发现我们也定义了两个 ”struct Date“类型的指针head 和end,这两个指针有上面用呢?我接着看这个代码,由于我们在结构体里面定义了一个指针next,则我们在代码中发现,我们对这个指针引用的时候给他赋了stu2的地址,而head则给赋了stu1的地址,却给stu2中的next赋了空也就是NULL(NULL相当于0),使他成为了一个空指针,然后又给end赋了head的值,我们知道head里面存储的是stu1的地址,也就是end储存的是stu1的地址,Ok我们一步一步看完这之前的代码后我们可能对这个代码还是一头雾水,我们那么我们写这些代码又有什么用呢,我接着往下看,因为每段代码有是有着他自己独特着作用的。

接着我们看到了while循环,while着个循环很特殊它的判断条件是看end指针是否为空指针,这个条件看起来是很奇怪,但是在printf后面我们发现,end的地址发生了改变,我们知道,end一开始指向的是stu1,而next存储的是下一个结构体的地址直到最后一个为NULL,这样我们就很容易发现,当循环每进行一次end的地址都会移动一次,如果我们把这几个结构体看成一个条我们会发现,next指针像一个口子衔接这下一个结构体,当这个end指针移动到到最后时也就是stu2的next指针的时候他的地址也就变成了NULL,从而这个循环也走到了尽头。

我们从新来看这段代码我们会发现,整段代码一直在移动的时end指针,通过end指针来移动位置从而达到改变输出值的效果。

当然静态链表的初探能了解的也就怎么多,对静态链表的操作熟悉是要对结构体熟悉,而对静态链表的完全理解,是对后面动态化后的极大帮助。

GG

by Walnut


国家保护废材