本帖最后由 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) ;
}
|