約瑟夫環函式:
typedef struct __node
{
int data;
struct __node* next;
}Node,*PNode;
void clist_josephus( int n, int m )
{
int i = 0,j = 1;
Node *head = (Node *)malloc(sizeof(Node));
Node *newnode = NULL, *q = head, *free_tmp;
head->data = 0;
head->next = NULL;
for ( i = 1; i < n; i++ )
{
newnode = (Node *)malloc(sizeof(Node));
newnode->data = i;
newnode->next = NULL;
q->next = newnode;
q = newnode;
}
q->next = head;
while ( q )
{
if ( j++ < m )
{
q = q->next;
}
else
{
free_tmp = q->next;
printf("%p\t%d\r\n",free_tmp,free_tmp->data);
q->next = q->next->next;
free(free_tmp);
free_tmp = NULL;
j = 1;
}
}
}
各位大神,我這個為什么會報錯呢,想不通,為什么最后一個環我給釋放了,并且置慷訓會跑進while,最后的q->next 和 q難道不一樣?
uj5u.com熱心網友回復:
既然是環,你就要檢測最后一個, q == q->next的情況此時的洗掉要特殊處理的,直接輸出這個q的資料,然后釋放q就好了
你的后續的free_tmp只有一個資料的環下面, q->next = q->next->next 依然是自身賦值給自身, free函式釋放的也是它
uj5u.com熱心網友回復:
while ( q ){
if (q == q->next ) {
// 無論m是多少,對只有一個節點的環來說,最終選定的必然還是這個唯一的節點,
printf("%p\t%d\r\n",q, q->data);
free(q);
q = NULL;
} else
if ( j++ < m )
{
q = q->next;
}
else
{
free_tmp = q->next;
printf("%p\t%d\r\n",free_tmp,free_tmp->data);
q->next = q->next->next;
free(free_tmp);
free_tmp = NULL;
j = 1;
}
uj5u.com熱心網友回復:
感謝您的回答,判斷是可以解決,但我疑問在于,為什么我將最后一個節點釋放了,并置為NULL,而它還能跑進while。uj5u.com熱心網友回復:
感謝您的回答,我明白問題所在了,犯了一個先入為主的低級錯誤,在剩下最后一個環的時候,其實釋放的是q->next也就是q,但是q->next置null,q被釋放了并沒有將q置為null,所以又跑進while,至于被釋放了的q被拿來用,并再次被賦值q->next(null),為什么沒退出,在錯誤的操作上再出錯也沒有在探究的意義了,感謝您
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/111550.html
標籤:C語言
上一篇:小白求教
下一篇:C++中int疑問
