数据结构之单链表

以上我的文章是参考大话数据结构和唐佐林的实战数据结构的心得

 

链表的引入是因为线性表的顺序存储结构,它有一个最大的缺点,就是插入和删除时需要移动大量元素,这个会需要大量时间。由此我们提出链表的概念,就是不考虑相连位置,哪里有空位,我们就去哪里,所以只要将内存地址链接起来,当我们知道第一个数据的地址,我们就会知道第二个地址,当知道第二个地址的时候,我们就会知道第三个地址。

因此,为了表示每个数据元素a[i]与a[i+1]的关系,还需要存储一个指针域,我们储存a[n]的地方成为数据域。这两部分信息组成数据元素a[i]的存储映像,称为结点(Node)

 

当Node中只包含一个节点定的时候,我们称为单链表

 

数据结构之单链表_第1张图片

 

这张图中记者我们一般链表中第一个节点位置的存储位置叫做头指针,链表的最后一个节点指针为空(通常用NULL表示)

/*线性表的单链表存储结构*/
typedef struct Node
{
 ElemType data;
 struct Node *next;
}Node;
typedef struct Node *linklist;/*定义linkList*/

单链表的读取步骤:

                            1.声明一个结点p指向链表的第一个结点,初始化j从1开始

                             2.当j

                             3.若到链表末尾p为空,则说明第i元素不存在

                            4.否则查找成功,返回结点数据

/*初始条件:顺序线性表L已存在,1<next;  /*让p指向链表L的第一个结点*/
 j=1;        /*j为计数器*/
 while(p &&  jnext; /* *p指向下一个结点*/
  ++j;
 }
 if(!p || j>=i) /*第i个元素不存在*/
 
  return RRROR;
  *e= p->data; /*取第i个元素*/
 return OK;
 
}

单链表的插入与删除

 

数据结构之单链表_第2张图片

一开始爸爸和妈妈谈恋爱的时候,只有他们两个人手牵手,链表插入与删除就相当于小孩在爸爸妈妈中间,然后手牵手。同理删除也是,就是加上一句话,s->next=p->next;p->next=s;删除就是q=p->next;p->next=q->next。

 

静态链表:

                   我们用过数字都知道,数字方便查询,不方便删除增加元素,但是链表我们有一个问题,就是它堆空间产生大量碎片,导致系统运行变慢。所以我们让数组元素由两个数据域组成,data和cur,也就是说,数组的每个下标都对应一个data和一个cur,数据域data,用来存放数据元数,也就是我们通常要处理的数据,而cur相当于单链表的next指针,存放改元数的后继在数组中,我们把cur叫做游标。用数组描述的链表叫做静态链表。

/*线性表的静态链接表存储结构*/
#define  MAXSIZE 1000
typedef struct
{
 ElemType data;
 int cur; //游标(Cursor),为0时表示无指向
}Component ,staticLinkList(MAXSIZE);

 

 

循环链表:

就是将最后的结点的NULL换成头指针,形成一个循环

 

 

你可能感兴趣的:(数据结构之单链表)