当前位置:编程学习 > C/C++ >>

用C语言数据结构做数组链表课程设计题·请狠人帮忙做下··

A是个“杀人不眨眼”的杀手,他早已构思好他的杀人计划:
1、N个人(包括A)坐成一圈,按顺时针编号 1 2 3 4 ... ...。
2、A从1号开始顺时针开始数到第m号就杀掉第一个人 。
3、如果第m个人恰好是A自己,他就杀掉他顺时针方向的下一个人。
4、A从被杀的人的下一个顺时针数m个人,把第m个杀掉。
5、重复2-4,直至杀掉所有人。

现在,你的任务是活到最后,与“杀人不睁眼”的A对决,成为最后的英雄。
基本要求
1、N,M由用户输入;
2、输出每一步被杀的人,最后输出你的最初位置;
3、数据结构至少用数组实现,用链表同时实现加分;
4、采用模块化程序设计方法,主函数用菜单形式调用各功能函数,程序可读性强,界面设计友好,输出形式美观。
现在急需 向往高人帮忙做一下 谢谢了····
答案:我是初学者,写的代码不好,仅做参考。很多地方都没有达到要求。没怎么调试,可能会有bug,如果楼主修改不了,在下面回复就好。编了这个也不容易,没有其他更好答案,分就给我吧O(∩_∩)O~

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct Node
{
int iData;
Node *pNext;
}pNode;

void Message(int *M)
{
while(1)
{
printf("Please enter the number of person:/n");

//英文水平有限
scanf("%d", &M[0]);
printf("Please enter the number of who will be killed:/n");
scanf("%d", &M[1]);
if(M[0] < 2 || M[1] < 2)
printf("You entered the wrong number, please enter them again");
else
break;
}
srand((int) time(0));

M[2] = rand() % (M[0] - 1) + 1;






//杀手位置随机产生
printf("**********************************************\
");
printf("A total of %d individuals\
",M[0]);
printf("Every %d locations to kill a person\
",M[1]);
printf("The killer is:%d \
", M[2]);
printf("**********************************************\
");
}
pNode *CreatChain(int *M)
{

int i = 0;
pNode *pHead,*pre, *cur;

pHead = (Node*)malloc(sizeof(Node));
if(M[2] != 1)
pHead->iData = 1;
else
pHead->iData = -1;



//杀手的位置置-1
cur = pHead;
for (i = 2; i < M[0] + 1; i++)


//创建循环链表
{
pre = (Node*)malloc(sizeof(Node));
if (i == M[2])
pre->iData = -1;
else
pre->iData = i;
pre->pNext = NULL;
cur->pNext = pre;
cur = pre;
}
cur->pNext = pHead;
return pHead;
}

void KillBegin(pNode *pHead, int *M)
{
int iNum = M[0];
//记录剩余人数
int iCount = 1;
//每M个被杀
int i = 1;


pNode *pre, *cur;
pre = pHead;
cur = pHead->pNext;
while (iNum > 2)
{
iCount++;

//因M>2,第一轮从2号开始判断(M = 1杀起来没意义)
if(iCount == M[1])
{
if(cur->iData == -1)
//判断第M个是否是杀手
{

pre = pre->pNext;

cur = cur->pNext;
}
pre->pNext = cur->pNext;
cur->pNext = NULL;
printf("The %dth victim will be:%d \
", i, cur->iData);
i++;
free(cur);



//杀掉第M个人
cur = pre->pNext;
iCount = 0;
iNum--;
}
else
{
pre = pre->pNext;
cur = cur->pNext;
}
}
printf("**********************************************\
");
if(pre->iData != -1)
printf("The hero is: %d\
", pre->iData);

//输出英雄位置
else
printf("The hero is: %d\
", cur->iData);
free(pre);
free(cur);
}

int main()
{
int M[3] = {0};

//M[0]总人数,M[1]杀第几个人,M[2]杀手位置
pNode *pHead = NULL;
Message(M);


//获得M信息
pHead = CreatChain(M);
//创建信息循环链表

KillBegin(pHead, M);
//开始杀人
return 0;
}

上一个:C语言编的,tc下没通过编译,帮忙看下,感激不尽~~~~~·
下一个:怎样学好C语言

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,