双链表 循环链表及静态链表

一、什么是双链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
在这里插入图片描述

二、双链表的创建和初始化

typedef struct DNode
{
      int data;
      struct DNode *prior,*next;
      
}DNode,*DLinklist;

bool InitDLinkList(DLinklist &L)
{
      L = (DNode*)malloc(szieof(DNode)); //分配一个头结点
      
      if(L == NULL){
          return false;      
      }
      L->prior = NULL;//头结点的prior 指向NULL
      L->next = NULL; //头结点之后暂时还没有结点
      return true;
}

void testDLinkList()
{
      DLinklist L;
      InitDLinkList(L);
      //。。。。
}

三、双链表的插入

//在p结点之后插入S结点
bool InsertNextDNode(DNode *p,DNode *s)
{
      if(p==NULL || s==NULL){
          return false;      
      }
      s->next = p->next;
      if(p->next !=NULL){  //如果p结点后有后继结点
         p->next->prior = s;      
      }
      s->prior = p;
      p->next = s;
      
      return true;      
}

四、双链表的删除

//删除p结点的后继结点
bool DeletNextDNode(DNode *p)
{
     if(p ==NULL){
        return false;     
     }
     //找到p的后继结点q
     DNode *q = p->next;
     
     if(q == NULL){    //p没有后继
        return false;     
     }
     p->next = q->next;
     if(q->next !=NULL){   //q不是最后一个结点
        q->next->prior = p;     
     }
     
     free(q);          //释放结点空间
     
     return true;
}

void DestoryList(DLinklist &L)
{
      while(L->next != NULL){
            DeletNextDNode(L);
            free(L);   //释放头结点
            L = NULL;      
      }
}

在这里插入图片描述
双链表不可随机存取,按位查找、按值查找都只能用遍历的方式实现

五、循环单链表

在这里插入图片描述

bool InitList(LinkList &L)
{
      L = (LNode*)malloc(sizeof(LNode));
      
      if(L==NULL){
         return false;      
      }
      L->next = L;    //头结点next指向头结点
      return true;
}

单链表:从一个结点出发只能找到后续的各个结点
双链表:从一个结点出发可以找到其他任何结点

六、循环双链表

在这里插入图片描述

bool InitList(LinkList &L)
{
      L = (LNode*)malloc(sizeof(LNode));
      
      if(L==NULL){
         return false;      
      }
      L->next = L;    //头结点next指向头结点
      L->prior = L;   //头结点的prior指向头结点
      return true;
}

七、静态链表

1.介绍:

用数组描述的链表,即称为静态链表。
在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR。

分配一整片连续的内存空间,各个结点集中安置

在这里插入图片描述

2.创建:

#define MaxSize 10

struct Node{
      int data;//数据元素
      int next;//下标
}

void testSLinkList()
{
       struct Node a[MaxSize];
       //......
}

另一种表示方法:
在这里插入图片描述

3.说明:

优点:增删操作不需要大量移动元素
缺点:不能随机存取,只能从头结点开始依次往后查找,容量固定不变
适用场景:
1.不支持指针的低级语言
2.数据元素数量固定不变的场景(如操作系统的文件分配表FAT)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值