原题链接:出圈
参考代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node
{
int id; //初始编号
struct Node *pNext;
} NODE, *PNODE;
//创建一个有n个结点的循环链表,返回头指针
PNODE create_list(int n)
{
//定义一个头结点,不存放有效数据
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (pHead == NULL)
{
perror("malloc error!");
exit(1);
}
//pHead->id = -1;
pHead->pNext = NULL;
PNODE pTail = pHead;
int i;
for (i = 0; i < n; i++)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (pNew == NULL)
{
perror("malloc error!");
exit(1);
}
pNew->id = i + 1;
pNew->pNext = NULL;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
pTail->pNext = pHead->pNext; //最后一个结点的指针域指向首结点,形成循环链表
return pHead;
}
//遍历链表,用于测试
void traverse_list(PNODE pHead, int list_len)
{
PNODE pCur = pHead->pNext;
int i;
for (i = 0; i < list_len; i++)
{
printf("%d ", pCur->id);
pCur = pCur->pNext;
}
}
//处理链表
int process(PNODE pHead, int m)
{
PNODE pCur = pHead->pNext;
//把头结点free,避免头结点在后续处理过程中带来的影响
free(pHead);
PNODE pDel = NULL;
while (pCur->pNext != pCur) //直到链表中只剩一个结点
{
int i;
for (i = 1; i < m - 1; i++)
{
pCur = pCur->pNext;
}
//从循环退出后,此时pCur指向被删除结点的前一个结点
pDel = pCur->pNext;
pCur->pNext = pDel->pNext;
free(pDel);
pCur = pCur->pNext;
}
int res = pCur->id;
free(pCur);
return res;
}
int main(void)
{
int res[10]; //存放结果的数组
int index = 0; //数组下标
int n, m;
while (scanf("%d %d", &n, &m) != EOF)
{
PNODE pHead = create_list(n); //创建长度为n的循环链表
res[index++] = process(pHead, m); //处理链表,结果存放在数组中
}
int i;
for (i = 0; i < index; i++)
{
printf("%d\n", res[i]);
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复