带哨兵的环形双向链表

来源:互联网 发布:淘宝全屏海报轮播 编辑:程序博客网 时间:2024/05/16 13:53
/* *带哨兵的环形双向链表 *具有对链表的插入 浏览 删除的功能 *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;        }    }}

结果截图如下:
这里写图片描述

0 0