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);
數(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);