数据结构之环形链表
- 环形链表
提示:
博主:来自火星的萨满_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一站式编程