關於狂人C第九章練習題二

2021-08-27 07:02:08 字數 1662 閱讀 1745

題目出自:

題目:

(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語句塊中...