目录
1. 好玩的约瑟夫环-单链表版本
【题目描述】
有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列;每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列,完成一遍游戏,所有出列的人形成新队列;游戏可能玩很多遍,每遍有新报数密码。求若干遍游戏完成后队列次序。本题要求使用单链表实现,程序要求采用模块化设计,格式规范,有合适注解。
【输入描述】
每个测试用例包含若干个正整数(至少1个),第一个正整数为玩游戏人数M,后续每个正整数为每遍游戏报数密码;报数密码可能为1
【输出描述】
每个测试用例结果占一行,每个编号占4位。
【样例输入】
10 3 5 2
【样例输出】
4 6 5 2 9 1 3 7 8 10
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node,*LinkList;
LinkList CreatNew(){
LinkList temp;
temp=(LinkList)malloc(sizeof(Node));
temp->next=NULL;
return temp;
}
void BuildCircle(LinkList *p,int m){
if(m == 0){
return;
}
LinkList phead,pnew,pold;
phead=*p;
pold=phead;
int i;
for(i=1;i<=m;i++){
pnew=CreatNew();
pnew->data=i;
pold->next=pnew;
pold=pold->next;
}
pold->next=phead->next;
}
void append(LinkList *p1,LinkList *p2, int n){
LinkList phead1,phead2,pold,pafter,pnext;
phead1=*p1;
phead2=*p2;
pold=phead1->next;
pafter=pold->next;
pnext=phead2;
while (phead1->next){
if(n>=3){
int i;
for(i=0;i<n-2;i++){
pold=pold->next;
pafter=pold->next;
}
}
else if(n==2){
pafter=pold->next;
}
else if(n==1){
pold=phead1;
pafter=pold->next;
}
if(!phead2->next){
phead2->next=pafter;
pnext=pnext->next;
}
else{
pnext->next=pafter;
pnext=pnext->next;
}
pold->next=pafter->next;
pold=pold->next;
if(pold==pold->next){
pnext=pold;
pnext->next=NULL;
break;
}
if(n==1){
if(pafter->next && pafter->next->data==phead2->next->data){
pafter->next=NULL;
break;
}
}
}
}
void print(LinkList p, int m){
int i;
for(i=0;i<m;i++){
printf("%4d",p->next->data);
p=p->next;
}
}
void repeat(LinkList *p) {
LinkList phead, pnext;
phead = *p;
pnext = phead -> next;
while(pnext -> next) {
pnext = pnext -> next;
}
pnext -> next = phead -> next;
}
void destroy(LinkList p)
{
LinkList pnext;
while(p) {
pnext = p -> next;
free(p);
p = pnext;
}
}
int main(){
LinkList p1,p2;
p1=CreatNew();
p2=CreatNew();
int m;
scanf("%d",&m);
BuildCircle(&p1, m);
int x;
scanf("%d",&x);
if(x==NULL){
print(p1,m);
return 0;
}
append(&p1,&p2,x);
while(getchar() == ' ') {
p1 = p2;
repeat(&p1);
p2 = CreatNew();
scanf("%d",&x);
append(&p1,&p2,x);
}
print(p2,m);
destroy(p2);
return 0;
}
2. 递增有序顺序表的插入
实验目的:1、掌握线性表的基本知识 2、深入理解、掌握并灵活运用线性表。3、熟练掌握线性表的存储结构及主要运算的实现
【问题描述】
已知顺序表L递增有序,将X插入到线性表的适当位置上,保证线性表有序。
【输入形式】
第1行输入顺序表长度,第2行输入递增有序的顺序表,第3行输入要插入的数据元素X。
【输出形式】
对每一组输入,在一行中输出插入X后的递增的顺序表。
【样例输入】
在这里给出一组输入。例如:
5 1 3 5 7 9 6
【样例输出】
在这里给出相应的输出。例如:
1,3,5,6,7,9,
【样例说明】
【评分标准】
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int num;
struct Node* next;
} Node, * LinkList;
int main() {
LinkList head = NULL;
LinkList tail = NULL;
int k;
scanf("%d", &k);
int n;
char ch;
while (scanf("%d%c", &n, &ch)) {
LinkList newNode = (LinkList)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Error: Failed to allocate memory for new node\n");
return 1;
}
newNode->num = n;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = tail->next;
}
if (ch == '\n') {
break;
}
}
int NewNum, cnt = 0, i;
scanf("%d", &NewNum);
LinkList p = head;
for (i = 0; i < k; i++) {
if (p == NULL) {
break;
}
if (p->num < NewNum) {
printf("%d", p->num);
printf(",");
p = p->next;
cnt++;
} else {
printf("%d", NewNum);
printf(",");
break;
}
}
if(cnt==k){
printf("%d", NewNum);
printf(",");
}
for (i = cnt; i < k; i++) {
if (p == NULL) {
break;
}
printf("%d", p->num);printf(",");
p = p->next;
}
return 0;
}