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

字號(hào):

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