关于指向指针的指针的问题
2013-03-29 21:22
369 查看
最近为了完成《编译原理》课程设计作业,我写了一个针对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,搞定了~~
#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,搞定了~~
相关文章推荐
- 关于“不允许指针指向不完整的类类型”问题分析
- C++关于父类指针指向子类对象的问题
- 关于IplImage结构体内指针imageData指向的数据的数据类型的问题
- 关于const指针和指向const类型的指针的问题
- 《深入详解VC++》第三者 74页关于this指针指向子类的问题
- 关于const指针和指向const对象的指针的初始化问题
- 由“一个关于指针的小问题”想到的:常量指针与指向常量的指针
- 关于继承类的指针指向基类的内存的问题
- C++关于基类指针指向子类对象的问题
- 关于JS中for循环时,作用域问题和this指针指向的总结
- oc 关于对象release后 指向它的指针如何处理的问题
- 关于多指针指向同一块内存的问题!
- 关于“不允许指针指向不完整的类类型”问题分析
- 关于基类指针指向子类对象,构造函数和析构函数调用的顺序的问题。
- 分享:关于指向指针的指针的问题
- 关于字符串指针指向内容不能修改的问题
- 关于指向结构体的指针——又一个指针用法中容易忽略的问题
- 关于C语言数组利用指针排序的问题
- 关于Objective-C 对象release操作野指针的一个小问题探讨
- 有关动态创建释放二维数组,以及指向数组的指针问题集合