最近为了完成《编译原理》课程设计作业,我写了一个针对token的链表,代码如下(部分):
#ifndef __TOKENLINKLIST__CPP__
#define __TOKENLINKLIST__CPP__
#include "tokenLinkList.h"
#include <iostream>
TokenLinkList::TokenLinkList() {
head = new TokenNode();
len = 0;
currentNode = head;
}
TokenLinkList::~TokenLinkList() {
clear();
delete head;
head = 0;
}
TokenNode* TokenLinkList::getElement(int pos) const {
TokenNode* tmpNode = head;
int count = 0;
while(pos > count) {
tmpNode = tmpNode->next;
count ++;
}
return tmpNode;
}
Status TokenLinkList::insert(char*data,TokenType tokenType) {
TokenNode* newNode = new TokenNode(data,tokenType);
if(newNode == 0) {
return StackOverflow;
}
if(len <= 0) {
head->next = newNode;
}
currentNode->next = newNode;
currentNode = newNode;
len ++;
return Success;
}
Status TokenLinkList::remove(int pos) {
if(pos > len || pos <= 0) {
return RangeError;
}
TokenNode* tmpNode = getElement(pos-1);
TokenNode* deleteNode = tmpNode->next;
tmpNode->next = deleteNode->next;
if(pos == len) {
//删除的是最后一个元素
//currentNode->next = tmpNode;
currentNode = tmpNode;
}
delete deleteNode;
deleteNode = 0;
len --;
return Success;
}
int TokenLinkList::length() const {
return len;
}
Status TokenLinkList::getElem(int pos,TokenNode** tokenNode) const {
if((pos > len) || (pos < 1)) {
return RangeError;
}
TokenNode* tmpNode = getElement(pos);
*tokenNode = tmpNode;
return Success;
}
Status TokenLinkList::setElem(int pos,char* data,TokenType tokenType) {
if((pos > len) || (pos < 1)) {
return RangeError;
}
TokenNode* tmpNode = getElement(pos);
tmpNode->data = data;
if(tokenType != Unsure) {
tmpNode->tokenType = tokenType;
}
return Success;
}
void TokenLinkList::clear() {
int tmpLen = len;
for(int tmp = 0; tmp < tmpLen; tmp++) {
remove(len-tmp);
}
}
void TokenLinkList::traverse(void(*visit)(char*,TokenType)) {
TokenNode* tmpNode = head;
while(tmpNode = tmpNode->next) {
visit(tmpNode->data,tmpNode->tokenType);
}
}
void TokenLinkList::debug() {
cout<<head->next->data;
}
#endif
之前在写remove()这个函数的时候,因为要取得TokenNode这个指针的值,我在remove函数参数里面使用了指向指针的指针,然后取得它的值,代码如下:
tokenNode = &tmpNode;
然而,在使用的时候一直取不到具体的数值,很郁闷,到底是错在那儿了?
后面请教了吕广奕之后才知道,tokenNode只是一个变量,那么修改形参的值,实参不会发生任何改变,那么调用的时候自然也得不到正确的结果~~
后面修改为:
*tokenNode = tmpNode;
OK,搞定了~~