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