首页 > 代码库 > 第三篇、双向链表(循环链表)

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

简介:

  在用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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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;        }    }}

 

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