第三篇双向链表(循环链表)

Posted 久冬不雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三篇双向链表(循环链表)相关的知识,希望对你有一定的参考价值。

简介:

  在用C/C++开发系统中,我们知道用数组或者单链表来开发,如果是数据比较大的话,性能很不好,效率也不高。因此常常需要考虑系统的实用性,常常采用双向链表来开发。

示例:

1.数据

typedef struct node{

  int data;                // 数据

  struct node *last;  // 前一个数据节点 

  struct node *next;  // 后一个数据节点

}Node;

typedef struct {

  Node *head;

  Node *tail;

}LinkList;

 

2.创建链表

LinkList *createList()
{
    LinkList *list = malloc(sizeof(LinkList));
    list -> head = NULL;
    lsit ->tail = NULL;
    return list;
}


3.插入

3.1头插法

void addNodeBeHead(LinkList *list,int num)
{
    Node *p = malloc(sizeof(Node));
    p -> data = num;
    p -> last = NULL;
    P -> next = NULL;
    
    if(list - > head != NULL)
    {
        // 1.指向新的节点
      // 2.新节点的next指向原来的节点
        // 3.新节点变成头节点
        list ->head->last = p;
        node ->next = list ->head;
        list -> head = p;
    }
    else{
        list -> head = P;
        list -> tail = p;
    }
}

 

3.2尾插法

void addNodeAfterTail(LinkList *list,int num)
{
    Node *p = malloc(sizeof(Node));
    p -> data = num;
    p -> last = NULL;
    P -> next = NULL;
    
    if(list - > head != NULL)
    {
        // 1.指向新的节点
      // 2.新节点的last指向原来的节点
      // 3.新节点变成尾节点
      list ->tail->next = p;
        node ->last = list -> tail;
        list -> tail = p;
    }
    else{
        list -> head = P;
        list -> tail = p;
    }
}

4.打印链表

void printList(LinkList *list)
{
    Node *p = list -> head;
    if(p == NULL)
    {
        printf("当前为空链表");
    }else
    {
        while(p != NULL)
        {
                printf("%s",p-> data);
                p = p-> next;
        }

    }
}

 

以上是关于第三篇双向链表(循环链表)的主要内容,如果未能解决你的问题,请参考以下文章

《链表》之带头双向循环链表

第三十三课 双向循环链表的实现

双向循环链表

数据结构带头双向循环链表

C语言教程“双向循环链表”学习总结及其代码实现

数据结构循环链表&&双向链表详解和代码实例