ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第六次课程

2021-11-15 22:32:35  阅读:134  来源: 互联网

标签:tmp struct int queue 课程 front 第六次 data


队列的链表实现

#include "bits/stdc++.h"
using namespace std;
// 队列的节点
struct Node
{
    int data;//数据域
    struct Node* next;//指针域
};
// 队首队尾指针
struct Queue
{
    struct Node* front;//队头指针
    struct Node* rear;//队尾指针
    int size;//队列长度
};

void QueueInit(struct Queue* queue)//初始化队列
{
    queue->front = NULL;
    queue->rear = NULL;
    queue->size = 0;
}

int QueueEmpty(struct Queue* queue)//判断队列为空
{
    return (queue->size == 0);//队列长度为空 返回1
}

void QueuePush(struct Queue* queue, const int data)//入队
{
    struct Node* node;
    node = (struct Node*)malloc(sizeof(struct Node));//为节点分配空间
    assert(node != NULL);//断言节点不为空 可进行后续程序
    node->data = data;
    node->next = NULL;
    if(QueueEmpty(queue))//如果队列为空
    {
        queue->front = node;
        queue->rear = node;
    }
    else
    {
        queue->rear->next = node;
        queue->rear = node;
    }
    ++queue->size;//队列长度++
}

int QueuePop(struct Queue* queue, int* data)//出队
{
    if (QueueEmpty(queue))//队列中没有数据 程序退出
    {
        return 0;
    }
    struct Node* tmp = queue->front;//创建临时节点
    *data = queue->front->data;
    queue->front = queue->front->next;
    free(tmp);
    --queue->size;
    return 1;
}
void QueueDestroy(struct Queue* queue)//销毁队列
{
    struct Node* tmp;
    while(queue->front)
    {
        tmp = queue->front;
        queue->front = queue->front->next;
        free(tmp);
    }
    queue->front=queue->rear=NULL;
}
void GetLength(struct Queue *queue)//获取队列长度
{
    int data= queue->size;
    printf("队列长度为:%d",data);
    printf("\n");
}
void GetHead(struct Queue *queue)//获取队头元素
{
    int data=queue->front->data;
    printf("队头元素是%d:",data);
    cout<<endl;
}
void QueueTreverse(struct Queue* queue)//遍历
{
    int data;
    struct Node *tmp;
    printf("队列中的元素是:");
    while(queue->front)
    {
        tmp=queue->front;
        data=tmp->data;
        printf("%d ",data);
        queue->front=queue->front->next;
    }
    printf("\n");
}
void menu(struct Queue* Q)
{
    int choice,data;
    cout<<"1.***入队     2.***出队"<<endl;
    cout<<"3.***队列长度  4.***队列遍历"<<endl;
    cout<<"5.***获取队列头元素    6.*****队列销毁"<<endl;
    cout<<"输入你的选择:";cin>>choice;
    switch (choice){
        case 1:cout<<"输入数据:";cin>>data;QueuePush(Q,data);break;
        case 2:QueuePop(Q,&data);cout<<"出队的元素是:"<<data<<endl;break;
        case 3:GetLength(Q);break;
        case 4:QueueTreverse(Q);break;
        case 5:GetHead(Q);break;
        case 6:QueueDestroy(Q);break;
        default:cout<<"请输入1-6范围内的值";break;
    }
}
int main(void)
{
    struct Queue queue;
    QueueInit(&queue);//初始化
    while (1)
    {
        menu(&queue);
    }
    return 0;
}

约瑟夫环的链表实现

#include "bits/stdc++.h"
using namespace std;
typedef struct Node{
    int num;
    struct Node *next;
}JoseNode,*pNode;
void JoseInit(pNode &p)//初始化约瑟夫环
{
    p=new JoseNode ;//分配空间
    p->next=p;//建立链表循环
}
void Jose_Insert(pNode &p,int n)//约瑟夫环的插入
{
    pNode tmp=p;//临时节点 始终指向头节点
    for(int i=1;i<=n;i++)
    {
        if(i==1) tmp->num=i;//为头节点录入第一个数据
        else
        {
            //创建新节点 并用尾插法
            JoseNode *newNode=new JoseNode ;
            newNode->num=i;
            tmp->next=newNode;
            newNode->next=p;//新节点的指针域指向头节点 建立循环
            tmp=newNode;//临时节点向后移一位
        }
    }
}
void Jose_Delete(pNode &p,int k,int n)//k是密码
{
    pNode tmp;
    cout<<"出环顺序为:";
    while (n!=0)//当环内人数不为0时 程序执行
    {
        for(int i=1;i<k-1;i++)//若要找到所求的位置节点 需找到其前一个位置节点
        {
            p=p->next;
        }
        tmp=p->next;//所求位置节点
        p->next=tmp->next;//让所求位置的前一个节点指针 指向所求位置的后一个节点
        cout<<tmp->num<<"->";
        free(tmp);//释放节点
        p=tmp->next;//将新节点向后移一个位置
        n--;
    }
}
int main()
{
    pNode p;
    int n,k;//n是人数 k是密码
    JoseInit(p);//初始化
    cout<<"输入人数和密码:";
    cin>>n>>k;
    Jose_Insert(p,n);//约瑟夫环插入
    Jose_Delete(p,k,n);//约瑟夫环的输出
}

约瑟夫环的数组实现

#include "bits/stdc++.h"
using namespace std;
int Joseph[100]={0};
int main()
{
    int n,m;//n是人数 m是密码
    int i=0,k=0,j=0;//i是数组下标标识位置 k是标记符标记数到了几 j是出局的人数
    cin>>n>>m;
    while(j!=n)
    {
        i++;//下标从1开始
        if(i>n) i=1;//如果超出下标n 重新从下标1开始
        if(Joseph[i]==0)
        {
            k++;
            if(k==m)//当数到m时 输出当前位置下标
            {
                j++;
                cout<<i<<"->";
                k=0;//重新初始化k 从0继续开始
            }
        }
    }
}

约瑟夫环的递归实现

#include "bits/stdc++.h"
using namespace std;
//ysf(n,k,i)=ysf(n-1,k,i-1) i!=1 ysf(n,k,i)=(n+k-1)%n i=1;
int ysf(int n,int k,int i)//n为总人数 报数为k 第i个人出队的编号
{
    if(i==1)
        return (n+k-1)%n;
    else
        return (ysf(n-1,k,i-1)+k)%n;
}
int main()
{
    int n,m;
    cout<<"输入人数和密码:";
    cin>>n>>m;
    cout<<"出环顺序:";
    for(int i=1;i<=n;i++)
        cout<<ysf(n,m,i)+1<<"->";
    return 0;
}

约瑟夫环递推法实现

#include "bits/stdc++.h"
using namespace std;
int cir(int n,int m)
{
    int p=0;
    for(int i=2;i<=n;i++)
    {
        p=(p+m)%i;//每次循环向前移动m个位置
    }
    return p+1;
}
int main()
{
    int n,k;
    cout<<"输入人数和密码";
    cin>>n>>k;
    cout<<"出环顺序:";
    cout<<cir(n,k);
    return 0;
}

标签:tmp,struct,int,queue,课程,front,第六次,data
来源: https://blog.csdn.net/m0_62377787/article/details/121345134

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有