1 RM碼劃分出現(xiàn)插入結(jié)點錯誤及內(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 用局部變量來代替形參出錯
函數(shù)名: void insubnode(WANode *sub, WANode *pre, Node *p, bool type)
功能 : 在結(jié)點p中插入鏈表一結(jié)點sub (結(jié)點p由鏈表和其他數(shù)據(jù)成員構(gòu)成),當(dāng)pre=0時,表示插入在p的頭部,而type是一個標(biāo)識,用以區(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é)點并沒有插入到預(yù)想的位置。改正后的代碼如下。
//…
if(!pre)
{
if(!type)
{
sub->next = p->wnode;
p->wnode = sub;
}
else
{
sub->next = p->anode;
p->anode = sub;
}
}
//…
1.2 當(dāng)鏈表申請空間不連續(xù)時,不能用釋放頭結(jié)點來釋放整條鏈表,而應(yīng)遍歷鏈表,一個一個釋放。
為保險起見,最好一個結(jié)點一個結(jié)點釋放,如上述Node結(jié)構(gòu)。先new wnode,再new anode,而只釋放頭結(jié)點,不能釋放整條鏈表。
1. 3 插入頭結(jié)點出錯
void insert(/*…,*/ node *root)
{
//…
if(rep != NULL)
{
p->next = rep->next;
rep->next = p;
}
else
{
p->next = root;
root = p;
}
//…
}
這樣做時,root不會改變,root指向的值改變后會在函數(shù)結(jié)束后改變,但root本身卻不會在函數(shù)結(jié)束后改變。
改正方法:用指針的引用,即函數(shù)聲明變?yōu)椤?/P>
void insert(/*…*/ node * & root)。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |