数据结构之环形链表

数据结构之环形链表

  • 环形链表

提示:
博主:来自火星的萨满_906285288
博客地址:http://blog.csdn.net/qq_29924041



概念:
前面两篇博客主要讲的是单向链表和双向链表,但是有没有发现,双向链表其实是在单向链表前面加了一个prev的指针,指向链表的前一个元素。而这里所说的环形链表也是基于双向链表的,在上一篇中,我们看到,双向链表其实是有两个首尾元素有特殊性的,即尾部元素的next一直是NULL,而首部元素的prev指针一直是NULL,那么,能不能将这样一个链表首尾链接起来,形成一个闭环的形式呢??
答案是肯定可以的啊。这样一个双向链表形成的闭环的形式就是环形链表。
下面展示一下示意图:

这里写图片描述
这张图很好的诠释了环形链表,当环形链表为空的时候,该元素的首尾prev和next的指向是一致的,当有元素插入的时候,就让head的next与插入元素的P存储一致,而head元素的prev与插入的元素的next存储一致,即存储的为地址而已。
这样形成的一种闭环的现状。同时只有一个head元素。

代码展示:

下面是改自双向链表的代码:

/*
 * ===========================================================================
 *
 *       Filename: ciclelinkedlist.c
 *    Description:  
 *        Version:  1.0
 *        Created:  2018ƒÍ01‘¬20»’ 21 ±51∑÷30√Î
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *a
 * ===========================================================================
 */
#include<stdio.h>
#include<stdlib.h>
#include "ciclelinkedlist.h"

struct node sentinel = {0,&sentinel,&sentinel};
struct link head = &sentinel;

link make_node(unsigned char item){
   link p = (link)malloc(sizeof(*p));
   if(p == NULL){
    perror("malloc link error");
    exit(0);
   }
   p->item = item;
   p->prev = p->next = NULL;
   return p;
}

void free_node(link p){
  if(p != NULL)
    free(p);
}

link search(unsigned char key){
  link p ;
  for(p = head -> next; p!=head ; p=p->next){
    if(p->item == key){
      return p;
    }
  }
  return NULL;
}

void insert(link p){
  p->next = head->next;
  head->next->prev = p;
  head->next=p;
  p->prev = head;
}

void delete(link p){
  p->prev->next = p->next;
  p->next->prev = p->prev;
}

void traverse(void(*visit)(link)){
  link p;
  for(p = head->next;p!=head;p = p->next){
    visit(p);
  }
}

void destory(void){
   link q,p = head->next;
   head->next = head;
   head->prev = head;
   while(p!=head){
     q = p;
     p = p -> next;
     free_node(q);
   }
}

void enqueue(link p){
  insert(p);
}


link dequeue(void){
  if(head->prev == head){
    return NULL;
  }else{
    link p = head->prev;
    delete(p);
    return p;
  }
}
/*
 * ===========================================================================
 *
 *       Filename:  linkedlist.h
 *    Description: µ•¡¥±ÌµƒΩ·ππÕ∑Œƒº˛µƒ∂®“ 
 *        Version:  1.0
 *        Created:  2018ƒÍ01‘¬20»’ 21 ±45∑÷27√Î
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *
 * ===========================================================================
 */

#ifndef __DOUBLELINKEDLIST_H_
#define __DOUBLELINKEDLIST_H_
typedef struct node* link;
struct node{
  unsigned char item;
  link prev,next;
};
link make_node(unsigned char item);
void free_node(link p);
link search(unsigned char key);
void insert(link p);
void delete(link p);
void traverse(void(*visit)(link));
void destory(void);
void enqueue(link p);
link dequeue(void);

#endif

本文案例主要来自linuxC一站式编程

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值