循环单链表 ,线性表,敢死队问题

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
//-------------------循环单链表---------------------------
typedef struct node
{
 int data;
 struct node *next;
}LNode;
LNode* Creat(int n) /* 创建循环链表 */
{
    LNode *s,*q,*head;
    if(n != 0)
    {
          head = q = (LNode *)malloc(sizeof(LNode));
          q->data = 1; /* 生成第一个结点并使其data值为1 */
          for(int i=2;i<=n;i++)
    {
     s = (LNode *)malloc(sizeof(LNode));
     q->next = s;
     q->next->data = i;/*赋值*/
     q = q->next;
    }
    q->next = head;
     }
     return head;
}
int Delete(LNode* head,int m)/* 链表的删除 */
{
    LNode *a;
    while (head->next != head)
    {
       for (int i = 1; i < m-1; i++)/*查找要删除结点的前一结点*/
       {
     head = head->next;
    }
       a = head->next;
       head->next = a->next;
       free(a);
       head = head->next;
     }
     return (head->data);
}
void TrackList()
{    
   char y_n = 'y';
      int m;    /*声明变量*/
      LNode *p;
      int z,y;
      int num;      
   printf("链表表储存结构\n\n");
   do
   {
    printf("请输入敢死队的人数:");
    scanf("%d",&num);
    if(num < 1)
    {
     printf("输入有误请重新输入\n");
     continue;
    }
    printf("请输入死亡数数字\n");
    scanf("%d",&m);
    if(m > num || m < 1 )
    { 
      printf("输入有误请重新输入");
      continue;
    }
    else
    {
      p=Creat(num);
      y=Delete(p,m);
      z = num-y+2;
      if(z%num == 0)  
       printf ("从第 %d号开始计数\n",z);
      else
       printf("从第%d号战士开始计数才能让排长最后一个留下来而不去执行任务!\n",(num-y+2)%num);
    }
    printf("是否采用循环单链表操作后续数据:");
    do
    {
     scanf("%c",&y_n);
    }while((y_n != 'y') && y_n != 'n' );     
   }while(y_n == 'y');
}
//----------------线性表-----------------------------------------------------
#define LIST_INIT_SIZE 100
#define LISTINCCREMENT 10
typedef int ElemType;
typedef struct        /*线性表的动态分配存储结构*/
{
 ElemType *elem;   /*存储空间基址*/
 int length;       /*当前长度*/
 int listsize;   /*当前分配的存储容量(以sizeof(ElemType)为单位)*/
}SqList;
int InitList_sq(SqList &L)   /*创建线性表函数*/
{
 L.elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); 
 if(!L.elem)
 {
  printf("存储分配失败");
  return 0; 
 } 
 else
 {
  L.length = 0;                /*空表长度为0*/
  L.listsize = LIST_INIT_SIZE;
  return 1;/*初始存储容量*/
 }
}
int ListInsert_Sq(SqList &L)     /*线性表再分配函数*/
{
 int *newbase;
 newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCCREMENT)*sizeof(ElemType));
              /*为顺序表增加一个大小为存储LISTINCCREMENT个数据元素的空间*/
 if(!newbase) 
 {
  printf("存储分配失败");
  return 0;
 }
 else
    {
        L.elem=newbase;                           /*新基址*/
        L.listsize += LISTINCCREMENT;         /*增加存储容量*/
  return 1;
    }
}
void TrackArr()
{
 char y_n = 'y';
 SqList Arr;
 int s,i,m,count=0;    /*声明变量*/
 LNode *p;
 int z,y;
    int num;
 printf("线性表储存结构\n\n");
 do
 {
  printf("请输入敢死队的人数:");
  scanf("%d",&num);
  if(num<1)
  {
   printf("输入有误请重新输入\n");
   continue;
  }
   printf("请输入死亡数数字\n");
   scanf("%d",&m);
   if(m>num || m<1)
   { 
    printf("输入有误请重新输入");
    continue;
   }
   InitList_sq(Arr);
   while(num > Arr.listsize )    /*当顺序表当前分配的存储空间大小不足时进行再分配*/
    ListInsert_Sq(Arr);
   for(i=0;i<num;i++)   /*为队员编号*/
    Arr.elem[i]=i+1;          
   s = num;
   i=0;      
   while(s>1)             /*当所剩敢死队员总数为1时,总循环结束*/
   {
    for(i=0;i<num;i++)
    {
     if(Arr.elem[i]!=0)
     {
      count++;
      if(count==5)         /*报数循环*/
      {
       Arr.elem[i]=0; /*表示队员出列*/
        count=0;     /*计数器清零*/
       s--;         /*敢死队员数-1*/
      }
     }
    }
   }
   for(i=0;i<num;i++) 
   {
    if(Arr.elem[i]!=0)
     if((num-Arr.elem[i]+2)%num==0) 
      printf("从第%d号战士开始计数才能让排长最后一个留下来而不去执行任务!\n",num);
     else
      printf("从第%d号战士开始计数才能让排长最后一个留下来而不去执行任务!\n",(num-Arr.elem[i]+2)%num);
   }
   printf("是否采用线性表操作后续数据:");
   do
   {
    scanf("%c",&y_n);
   }while((y_n != 'y') && y_n != 'n' );      
  }while(y_n = 'y');    
}

//---------------------------
void Menu()
{
  printf("++++++++++++++++++++++++++++++++++++++\n");
  printf("|       1.循环链表                   |\n");
  printf("|       2.线 性 表                   |\n");
  printf("|       3.退    出                   |\n");
     printf("++++++++++++++++++++++++++++++++++++++\n");
  printf("请选择解决问题的方法:(1~3)\n\n"); 
}
//-----------------------------------------------------------------------------
int main()
{
 system("color 0D");
 int opt; 
 char yes_no ='y';
 Menu(); 
 do
 {  
   printf("请选择用何种数据结构处理问题:");
   scanf("%d",&opt);
   switch(opt)
   {
    case 1: TrackList(); break;
    case 2: TrackArr(); break;
    case 3: exit(0);
   }
   printf("是否继续(y/n):  ");
   do
   {
    scanf("%c",&yes_no);
   }while((yes_no != 'y') && yes_no != 'n' );  
 }while(yes_no=='y');
 return 0;
}
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值