威望0
积分7946
贡献0
在线时间763 小时
UID1
注册时间2021-4-14
最后登录2024-11-21
管理员
- UID
- 1
- 威望
- 0
- 积分
- 7946
- 贡献
- 0
- 注册时间
- 2021-4-14
- 最后登录
- 2024-11-21
- 在线时间
- 763 小时
|
[mw_shl_code=c,true]#include<stdio.h>
#include<stdlib.h>
/* 定义单链表节点类型 */
typedef struct node{
int ser_num;
struct node * next;
}linklist;
linklist * Init(int n){
//n为单向链表的节点数,human_list为单向链表指针
linklist *p,*q,*human_list;
int i;
q=(linklist *)malloc(sizeof(linklist));
human_list = q;
for(i=1;i<n;i++){ //初始化单向链表 ,从1-n开始编号。
p=(linklist *)malloc(sizeof(linklist));
q->ser_num=i;
q->next=p;
q=p;
}
q->ser_num=n;
p->next=human_list;
human_list=q->next;
return human_list; //此时human_list指向链表的第一个位置
}
void printf_List(int num,linklist *human_list){ //将幸存的人的编号输出
int i;
for(i=0;i<num;i++){//初始化遍历输出
printf("%6d",human_list->ser_num);
human_list = human_list->next;
}
}
//扔人下船至剩余k人
linklist * Delete(int huamn_num,int begin_num,int sersidue_num,int k,linklist * human_list){
int i;
linklist *p,*q;//p循环,q记录
p = human_list;//起始1
q=p;
for(i=0;i<huamn_num-1;i++){
q=q->next;
}
//q=q->next; //起始human_num
for(i=0;i<begin_num-1;i++){
p = p->next;
q = q->next;
}
printf("\n\n扔下的人的序号:\n");
printf("%6d",p->ser_num);
q->next=p->next;
p=p->next;
for(;huamn_num-1>k;huamn_num--){
for(i=0;i<sersidue_num-1;i++){
p = p->next;
q = q->next;
}
printf("%6d",p->ser_num);
q->next=p->next;
p=p->next;
}
p=q;
for(i=0;i<k;i++){
p=p->ser_num<q->ser_num?p:q;
q=q->next;
}
human_list=p;
return human_list;
}
//human_num 总人数
//sersidue_num 间隔数
//k 可剩余人数
//begin_num 开始序号
int main(){
int human_num,sersidue_num,k,begin_num,i;
linklist * human_list;
printf("总人数n: ");
scanf("%d",&human_num);
printf("选择第一个扔下船的序号j: ");
scanf("%d",&begin_num);
printf("选择扔下船的间隔数m: ");
scanf("%d",&sersidue_num);
printf("可幸存人数k: ");
scanf("%d",&k);
human_list = Init(human_num);
printf("\n\n总人数遍历结果:\n");
printf_List(human_num,human_list);
human_list = Delete(human_num,begin_num,sersidue_num,k,human_list);
printf("\n\n幸存的人的序号:\n");
printf_List(k,human_list);
getch();
}
[/mw_shl_code] |
|