C結構體與鏈表

天來總結C語言的學習盲點——結構體,爲了避免顯單一,也爲了補足做者鏈表的編程缺陷,特更此博文,總結近段時間的學習成果。話很少說,先上一段代碼算法

struct none{int item; link next;};
typedef struct none *link;
 
int main(int argc ,char *argv[])
{
   int i , N = atoi(argv[1]) , M = atoi(argv[2]);
    link t = malloc(sizeof(*t)) , x=t;
    t->item = 1; t->next = t;

    for(i=2 ; i <= N ; i++)
    {
        x = x->next = malloc(sizeof(*x));
        x->item = i; x->next = t;
    }

    while(x != x->next)
    {
        for(i=1 ; i < M ; i++)
            x = x->next;
        x->next = x->next->next;
    }
    printf("%d\n",x->item);
    return 0;

}

上面這段代碼是解決約瑟夫問題的一種算法編程

碼開頭兩行定義一個鏈表的數據節點併爲節點結構取一別名link,注意:使用typedef取別名不能定義新的數據結構,只能對現有結構取別名。主函數裏獲取執行程序時對主函數輸入的參數,函數第一個參數argc保存輸入參數個數,第二個參數argv保存輸入參數(參數類型爲字符串)。for循環執行添加N個鏈表節點,並讓其首尾相連。此處做者想重點講講關於結構體的用法,指針結構體變量調用結構體成員使用-link->item或(link).item,其他使用a.item。而且->與.的優先級與()、[]比其它運算符優先級高,故a.data表示爲*(a.data)、++a.data表示++(a.data),這些概念都是做者在初學結構體沒有注意到的點,到實戰中給做者帶來很多麻煩,先一併概括分享。while循環對選中的節點刪除,直至剩餘一個節點,最後輸出剩下的節點數據。安全

要覺得這樣就結束了,程序還存在一些隱藏的bug,好比刪除鏈表的節點去哪了,既然對節點分配了內存,刪除的時候是否須要釋放其內存呢,固然,若是程序比較小,系統資源充足,你能夠這麼幹,可是對大型且安全要求較高的程序來講,由此形成的內存泄漏問題存在未知的風險,爲了規避可能存在的風險,malloc應該與free配套使用,因此代碼應改進爲:數據結構

int main(int argc , char *argv[])
{
 
    int i , N = atoi(argv[1]) , M = atoi(argv[2]);
    link t = malloc(sizeof(*t)) , x=t , a;
    t->item = 1; t->next = t;

    for(i=2 ; i <= N ; i++)
    {
        x = x->next = malloc(sizeof(*x));
        x->item = i; x->next = t;
    }

    while(x != x->next)
    {
        for(i=1 ; i < M ; i++)
            x = x->next;
        a = x->next ;
        x->next= a->next;
        free(a);
    }
    printf("%d\n",x->item);
    return 0;
}

bug無盡,若有不足之處,歡迎各位道長分享評論函數

相關文章
相關標籤/搜索