奥普瓯江 发表于 2021-9-24 21:30:56

约瑟夫问题


代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXSIZE 41

typedef struct Like
{
        int T;
        struct Like *next;
}Like, *Likes;

void explain();                        //本程序各个功能说明
void InitList(Likes *N);//清空数据并初始化程序
void GetList(Likes *N);        //随机创建41人员个编号
void PutList(Like *N);        //打印所有链表
void DeThList(Likes *N);        //依次删除第三人并打印编号
void DeThTwList(Likes *N);        //依次删除第三人直至剩余最后两人并打印
void InsertList(Likes *N);        //指定位置插入
void DeApList(Likes *N);        //指定位置删除
void DeApList(Likes *N)
{
        int K;
        Like *temp = (*N)->next, *temps;

        printf("删除数据:");
        scanf("%d", &K);

        while (temp->T != K)
        {
                temps = temp;
                temp = temp->next;
                if (temp == (*N)->next)
                {
                        printf("未找到匹配的数据请确认输入是否准确。\n");
                        return;
                }
        }
        if ((*N)->next == temp)
        {
                do
                {
                        temps = temp;
                        temp = temp->next;
                } while (temp != (*N)->next);
                (*N)->next = temp->next;
        }
        temps->next = temp->next;
        free(temp);



       

}
void InsertList(Likes *N)
{
        int K;
        Like *temp = (*N)->next, *temps;


        scanf("%d", &K);
        getchar();
        printf("在%d之后插入\n", K);

        while (temp->T != K)
        {
                temp = temp->next;
                if (temp == (*N)->next)
                {
                        printf("未找到匹配的数据请确认输入是否准确。\n");
                        return;
                }
        }

        temps = (Likes )malloc(sizeof(Like ));
        printf("输入插入的值:");
        scanf("%d", &temps->T);
        getchar();
        temps->next = temp->next;
        temp->next = temps;
}
void DeThTwList(Likes *N)
{
        int i, j;
        Like *temp = (*N)->next, *temps, *tempss;

        for (i = 0; i < MAXSIZE - 2; i++)
        {
                for (j = 0; j < 2; j++)
                {
                        temps = temp;
                        temp = temp->next;
                }
                if ((*N)->next == temp)
                {
                        (*N)->next = temp->next;        //如果头文件数据域被删除,用temp->next更换头文件数据域中的数据
                }
                tempss = temp;
                temp = temp->next;       
                temps->next = temp;        //与前一个链表相连
                free(tempss);
        }
        PutList(*N);

}
void DeThList(Likes *N)
{
        int i, j;
        Like *temp = (*N)->next, *temps, *tempss;

        for (i = 0; i < MAXSIZE; i++)
        {
                for (j = 0; j < 2; j++)
                {
                        temps = temp;
                        temp = temp->next;
                }

                if (temp == (*N)->next)
                {
                        (*N)->next = temp->next;
                }
                printf("<%d>", temp->T);
                tempss = temp;
                temp = temp->next;
                temps->next = temp;
                free(tempss);
        }
        putchar('\n');

}

void PutList(Like *N)
{
        Like *temp = N->next;
        while (1)
        {
                printf("<%d>", temp->T);
                temp = temp->next;

                if (N->next == temp)
                {
                        break;
                }
        }
        putchar('\n');
}
void GetList(Likes *N)
{
        int i;
        Like *temp, *tail;
        srand((unsigned)time(NULL));        //随机数按照时间归零

        for (i = 0; i < MAXSIZE; i++)
        {
                temp = (Like *)malloc(sizeof(Like ));
                temp->T = (rand() % 100);
               
               
                if ((*N)->next == *N)
                {
                        (*N)->next = temp;
                }
                else
                {
                        tail->next = temp;
                }
                tail = temp;
                tail->next = (*N)->next;
        }
       
}

void InitList(Likes *N)
{
        int i = 0;
        Like *temp;

        if (*N != NULL)
        {
                while (i <= MAXSIZE)
                {
                        temp = *N;
                        *N = (*N)->next;
                        free(temp);
                        i++;
                }
        }
        *N = (Likes )malloc(sizeof(Like ));
        (*N)->next = *N;       
}
void explain()
{
        printf("1、清空数据并初始化程序\n");
        printf("2、随机创建41人员个编号\n");
        printf("3、打印所有人员编号\n");
        printf("4、依次删除第三人并打印编号\n");
        printf("5、依次删除第三人直至剩余最后两人\n");
        printf("6、指定位置插入\n");
        printf("7、删除指定人员\n");
        printf("0、结束本程序\n");
}

int main()
{
        int i;
        Like *N = NULL;

        explain();
        while (1)
        {
                printf("输入选项:");
                scanf("%d", &i);
                getchar();

                switch (i)
                {
                case 1:{
                        InitList(&N);
                           }
                        break;
                case 2:{
                        GetList(&N);
                           }
                        break;
                case 3:{
                        PutList(N);
                           }
                        break;
                case 4:{
                        DeThList(&N);
                           }
                        break;
                case 5:{
                        DeThTwList(&N);
                           }
                        break;
                case 6:{
                        InsertList(&N);
                           }
                        break;
                case 7:{
                        DeApList(&N);
                           }
                        break;
                case 0:{
                        return 0;
                           }
                        break;
                }
        }
       

        return 0;
}
页: [1]
查看完整版本: 约瑟夫问题