|
发表于 2019-3-20 16:54:07
|
显示全部楼层
本帖最后由 jackz007 于 2019-3-20 17:53 编辑
这条语句看上去确实多余,楼主可以忽略它。
我对楼主的代码作了些许改动,阅读起来会略微清晰一些,请楼主测试指正:
- #include<stdio.h>
- #include<stdlib.h>
- typedef struct node {
- int data ;
- struct node * next ;
- } node ;
- node * create(const int n)
- {
- node * head , * p1 , * p2 ;
- int i ;
- p1 = head = NULL ;
- for(i = 0 ; i < n ; i ++) {
- p2 = (node *)malloc(sizeof(node)) ; // 为新节点分配内存空间
- p2 -> data = i + 1 ; // 为新节点赋值
- p2 -> next = head ; // 让新节点链接到首节点,形成闭环
- if(! i) head = p2 ; // 如果是第一个节点,赋值给 head
- else p1 -> next = p2 ; // 否则让前一个节点的指针链接到新节点
- p1 = p2 ; // 准备纳入下一个新的节点
- }
- return head ;
- }
- void JosephCircle(const int m , const int n)
- {
- int i , k ;
- node * p , * temp ;
- p = create(n) ;
- k = n ;
- while(k >= m) { // 循环条件:剩余节点数大于等于循环周期
- for(i = 1 ; i < m - 1 ; i ++) p = p -> next ; // 找到待删除节点的前一个节点
- temp = p -> next ; // 定位到待删除节点
- p -> next = temp -> next ; // 删除节点
- free(temp) ; // 释放内存
- p = p -> next ; // p 指向下一次操作的起始节点
- k -- ; // 剩余节点减 1
- }
- printf("%4d : m = %d , n = %4d\n" , p -> next -> data , m , n) ; // 打印出最终剩余节点的数值
- while(p -> next != p) { // 彻底释放剩余节点占用内存
- temp = p -> next ; // 彻底释放剩余节点占用内存
- p -> next = temp -> next ; // 彻底释放剩余节点占用内存
- free(temp) ; // 彻底释放剩余节点占用内存
- }
- free(p) ; // 彻底释放剩余节点占用内存
- }
- int main(void)
- {
- JosephCircle(3 , 3) ;
- JosephCircle(3 , 4) ;
- JosephCircle(3 , 5) ;
- JosephCircle(3 , 10) ;
- JosephCircle(3 , 41) ;
- }
复制代码 |
|