題目出自:
題目:
(2)乙個旅行社要從n個旅客中選出一名旅客,為他提供免費的環球旅行服務。旅行社安排這些旅客圍成乙個圓圈,從帽子中取出一張紙條,用上面寫的正整數m(程式設計對某個給定的n = 8與m = 3,給出被淘汰出列的旅客編號,以及最終的倖存者。
**我是這麼寫的:
#include #include typedef struct node node;
node * init(int n);
void delete(node *sptr, int n);
int main()
deletenumber = temp->number;
temp = temp->nextptr;
delete(head, deletenumber);
}printf("survivors is %d\n", temp->number);
free(temp);
return 0;
}node * init(int n)
curnode->nextptr = head;
return head;
}void delete(node *sptr, int n)
preptr->nextptr = curptr->nextptr;
printf("delete %d\n", curptr->number);
free(curptr);
}
輸入m=3,n=8執行結果是:
##############################
./a.out 3 81-->2-->delete 31-->2-->4-->5-->delete 6段錯誤
##############################
最後面發現錯在head這個node指標變數,本意是想用來儲存單向迴圈鍊錶的頭節點資訊,然後通過每次從head開始遍歷鍊錶來刪除節點,而
delete(head,deletenumber);
這一句依賴head,在第三次迴圈刪除節點1之後,head就相當於指向乙個被收回的位址,就產生段溢位錯誤了。
最後修改程式邏輯,使用temp來傳參給delete函式來開始遍歷鍊錶就ok了,如下改動:
// node * head = null;
// head = init(n);
// temp = head;
上面三行替換成temp = init(n);
//delete(head, deletenumber);
上面這行替換成delete(temp, deletenumber);
執行結果:
./a.out
3 84-->5-->6-->7-->8-->1-->2-->delete 3
7-->8-->1-->2-->4-->5-->delete 6
2-->4-->5-->7-->8-->delete 1
7-->8-->2-->4-->delete 5
4-->7-->8-->delete 2
4-->7-->delete 8
7-->delete 4
survivors is 7
第九章 習題
一 填空題 1 執行異常,可以 預料 但不能避免,它是由 系統執行環境 造成的。2 在小型程式開發中,一旦發生異常所採取的方法一般是 將程式立即中斷執行,從而無條件釋放所有資源 3 c 的異常處理機制使得異常的引發和處理 不必 在同一函式中。4 如果預料某段程式 成對某個函式的呼叫 有可能發生異常,...
第九章 習題
一 填空題 1 執行異常,可以 預料 但不能避免,它是由 系統執行環境 造成的。2 在小型程式開發中,一旦發生異常所採取的方法一般是 將程式立即中斷執行 3 c 的異常處理機制使得異常的引發和處理 不必 在同一函式中。4 如果預料某段程式 成對某個函式的呼叫 有可能發生異常,就將它放在 try語句塊...
第九章 習題
1 執行異常,可以預料,但不能避免,它是由系統執行環境造成的。2 在小型程式開發中,一旦發生異常所採取的方法一般是將程式立即中斷執行,從而無條件釋放所有資源 3 c 的異常處理機制使得異常的引發和處理不必在同一函式中。4 如果預料某段程式 成對某個函式的呼叫 有可能發生異常,就將它放在try語句塊中...