🍓个人主页:bit.. 

🍒系列专栏:Linux(Ubuntu)入门必看   C语言刷题      数据结构与算法

目录

一.头插法

二.尾插法(后插法)

三.循环链表


一.头插法

建立单链表;头插法——元素插入在链表头部,也叫前插法。

算法步骤:

  1. 从一个空表开始,重复读入数据元素。
  2. 生成新结点,将读入数据存放到新结点的数据域中。
  3. 从最后一个结点开始,依次将各结点插入到链表的前端。

例如:建立链表L 

数据结构与算法——链表(头插法,尾插法,循环链表)_结点

 算法描述:

void CreataList_H(LinkList &L,int n){
    L=new LNode;
    L-->next=NULL;    //先建立一个带头结点的单链表
for(i=n;i>0;--i){
    p=new LNode;  //生成新结点 p=(LNode*)malloc(sizeof(LNode));
    cin>>p-->data; //输入元素值 scanfs(&p-->data);
    p-->next=L-->next; //插入到头表
    L-->next=p;
  }
}//Create List_H

二.尾插法(后插法)

算法步骤:

从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的为节点。

初始时,r同L均指向头节点,每读入一个数据元素则申请一个新结点,将新结点插入到尾部结点后,r指向新结点。

数据结构与算法——链表(头插法,尾插法,循环链表)_循环链表_02

 算法描述:

//正位序输入n个元素的值,建立带头节点的单链表L
void CreateList_R(LinkList &L,int n){
    L=new LNode;
    L-->next=NULL;
    r=L; //尾指针r指向头结点
for(i=0;i<n;++i){
    p=new LNode;
    cin>>p-->data; //生成新结点,输入元素的值
    p-->next=NULL;
    r-->next=p; //插入到表尾
    r=p;  //r指向新的尾结点
    }
}//LreateList_R

三.循环链表

        循环链表:是一种头尾相接的链表(即:表中最后一个结点的指针域指向头结点,整个链表形成一个环状)

数据结构与算法——链表(头插法,尾插法,循环链表)_循环链表_03

 优点:

        从表中任意结点出发均可找到表中其他结点。

注意:由于循环链表没有NULL指针,故涉及遍历操作时,其终止条件就不再像非循环链表那样判断p或p-->next是否为空,而是判断它们是否等于头指针)

循环链表的写发与单链表类似 只需改变循环条件

单链表循环条件:

p!=NULL;

p-->next!=NULL;

单循环链表  循环条件:

p!=L;

p-->next!=L;

例如:带尾指针循环链表的合并 

数据结构与算法——链表(头插法,尾插法,循环链表)_数据结构_04

操作:

  1. Tb表头连接到Ta表尾
  2. Tb头节点释放
  3. 修改指针
LinkList connect(LinkList Ta,LinkList Tb){
//假设Ta,Tb是非空单循环链表
    p=Ta-->next;
    Ta-->next=Tb-->next-->next;
    delete Tb-->next;
    Tb-->next=p;
    return Tb;
}