数据结构学习笔记(3)---循环链表(约瑟夫环问题)

来源:互联网 发布:库存管理 php 源代码 编辑:程序博客网 时间:2024/06/05 02:36
最近学习循环链表,其实循环链表的本质和单向链表没有多大区别的,只是在创建时把最后的指针指向头结点,但是当想用循环链表解决约瑟夫环的问题时,要去掉头结点。
(1)循环链表的创建
void CreateCircleList(pCircleNode pHead){    int date;    cout << "请输入节点得值:";    cin >> date;    pCircleNode pTail = pHead;    while (-1 != date)    {        pCircleNode pNew = new CircleNode;        pNew->next = NULL;        pNew->date = date;        pTail->next = pNew;        pTail = pNew;        cout << "请输入节点得值:";        cin >> date;    }    pTail->next = pHead->next;}
(2)显示循环链表
void ShowList(pCircleNode pHead){    pCircleNode p = pHead->next;    do    {        cout << p->date<<"  ";        p = p->next;    } while (p != pHead->next);    cout << endl;}
(3)用循环链表解决约瑟夫环问题
pCircleNode Joseph(pCircleNode pHead, int n){    pCircleNode p = pHead;    pCircleNode pPre = NULL;;    while (p->next != pHead)    {        p = p->next;    }//找到第一个节点的前置节点    pPre = p;    p = pHead;    pHead = NULL;    while (p->next != p)//判断是否还剩最后一个节点    {           int nPos = 1;        while (nPos != n)//到达指定位置        {            pPre = p;            p = p->next;            nPos++;        }        pCircleNode pDelete = pPre->next;        pPre ->next = pPre->next->next;        delete pDelete;        p = pPre->next;//别忘记对p赋值    }    return p;}
阅读全文
0 1
原创粉丝点击