C/C++程序中遇到的一些問題及解決思路

字號:

1 RM碼劃分出現(xiàn)插入結點錯誤及內(nèi)存泄露(鏈表)
    數(shù)據(jù)結構。
    #define LEN 256
    #define REPLEN 20
    typedef char BIT8;
    typedef int BIT32;
    typedef struct walacrnode
    {
    BIT32 wa[LEN];
    struct walacrnode *next;
    }WANode;
    typedef struct node
    {
    WANode *wnode;
    WANode *anode;
    BIT32 connum;
    BIT8 rep[REPLEN];
    struct node *next;
    }Node;
    1.1 用局部變量來代替形參出錯
    函數(shù)名: void insubnode(WANode *sub, WANode *pre, Node *p, bool type)
    功能 : 在結點p中插入鏈表一結點sub (結點p由鏈表和其他數(shù)據(jù)成員構成),當pre=0時,表示插入在p的頭部,而type是一個標識,用以區(qū)別wnode和anode。
    我在此函數(shù)中寫下了下面的代碼。
    //.....
    WANode *wan = p->wnode;
    if(type)
    wan = p->anode;
    if(!pre)
    {
    sub->next = wan;
    wan = sub;
    }
    //.....
    結果發(fā)現(xiàn)sub結點并沒有插入到預想的位置。改正后的代碼如下。
    //....
    if(!pre)
    {
    if(!type)
    {
    sub->next = p->wnode;
    p->wnode = sub;
    }
    else
    {
    sub->next = p->anode;
    p->anode = sub;
    }
    }
    //....
    1.2 當鏈表申請空間不連續(xù)時,不能用釋放頭結點來釋放整條鏈表,而應遍歷鏈表,一個一個釋放。
    為保險起見,一個結點一個結點釋放,如上述Node結構。先new wnode,再new anode,而只釋放頭結點,不能釋放整條鏈表?! ?BR>    1. 3 插入頭結點出錯
    void insert(/*...,*/ node *root)
    {
    //....
    if(rep != NULL)
    {
    p->next = rep->next;
    rep->next = p;
    }
    else
    {
    p->next = root;
    root = p;
    }
    //....
    }
    這樣做時,root不會改變,root指向的值改變后會在函數(shù)結束后改變,但root本身卻不會在函數(shù)結束后改變。
    改正方法:用指針的引用,即函數(shù)聲明變?yōu)椤?BR>    void insert(/*...*/ node * & root);