/*
*带哨兵的环形双向链表
*具有对链表的插入 浏览 删除的功能
*Author: StoryMonster
*Last Change Date: 2016/6/22
*/
#include <iostream>
#include <stdlib.h>
typedef struct CircleChain
{
struct CircleChain *prev;
int value;
struct CircleChain *next;
} CircleChain;
int CurrentLength = 0;
CircleChain *sentinel = (CircleChain *)malloc(sizeof(CircleChain)); //哨兵
/*
*向环形双向链表中插入一个元素
*/
bool Insert(CircleChain * chain)
{
if(sentinel->next == NULL)
{
sentinel->next = chain;
chain->next = chain;
chain->prev = chain;
CurrentLength++;
return true;
}
CircleChain *p = sentinel->next;
CircleChain *p1 = p->prev;
p1->next = chain;
p->prev = chain;
chain->next = p;
chain->prev = p1;
CurrentLength++;
return true;
}
void Scan()
{
CircleChain *p = sentinel->next;
CircleChain *p1 = p;
std::cout << p->value << "-->";
p = p->next;
while(p != p1)
{
std::cout << p->value << "-->";
p = p->next;
}
std::cout << p->value<< std::endl;
}
bool Delete(int value)
{
CircleChain *p = sentinel->next;
CircleChain *p3 = sentinel->next;
CircleChain *p1 = p->prev;
CircleChain *p2 = p->next;
if(CurrentLength == 1)
{
if(p->value == value)
{
sentinel->next = NULL;
free(p);
CurrentLength--;
return true;
}
}
int len = CurrentLength;
p = p->next;
while(p != p3)
{
if(p->value == value)
{
len--;
p1->next = p2;
p2->prev = p1;
free(p);
p = p2;
}
else
{
p = p->next;
}
p1 = p->prev;
p2 = p->next;
}
if(p->value == value)
{
len--;
p1->next = p2;
p2->prev = p1;
sentinel->next = p2;
free(p);
}
if(len == CurrentLength)
{
return false;
}
else
{
CurrentLength = len;
return true;
}
}
int main()
{
CircleChain *chain = NULL;
int value = 0;
int choice = 0;
int offset = 0;
sentinel->next = NULL;
sentinel->prev = NULL;
while(1)
{
std::cout << "1:insert 2:delete 3:scan "<<std::endl;
std::cout << "your choice:";
std::cin >> choice;
switch(choice)
{
case 1:std::cout << "input value:";
std::cin >> value;
chain = (CircleChain *)malloc(sizeof(CircleChain));
chain->next = NULL;
chain->prev = NULL;
chain->value = value;
Insert(chain);
std::cout << "there are total " << CurrentLength <<" data in chain!"<< std::endl;
break;
case 2:std::cout << "input the delete value:";
std::cin >> value;
if(Delete(value))
{
std::cout << "delete ok!"<< std::endl;
}
else
{
std::cout << "delete fail!" << std::endl;
}
break;
case 3:Scan();break;
}
}
}
结果截图如下: