参考代码如下:
#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语言训练-计算一个整数N的阶乘 (C语言代码)浏览:928 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:1294 |
本人酷爱递归实现很多问题,这里也是浏览:549 |
WU-格式化数据输出 (C++代码)浏览:1194 |
C语言程序设计教程(第三版)课后习题6.8 (C语言代码)浏览:522 |
【求[X,Y]内被除3余1并且被除5余3的整数的和】 (C语言代码)浏览:672 |
字符逆序 (C语言代码)浏览:636 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:632 |
幸运数 (C++代码)浏览:1258 |
C二级辅导-分段函数 (C语言代码)浏览:593 |