c++,大家帮我看看,这个新建链表函数有什么问题?
大家帮我看看,这个新建链表函数有什么问题?小弟不才,我实在找不出来错在哪里?
首先一个类,表示节点:
- C/C++ code
class ClassNode:{private: //字符 char letter; //字符数量 int amount; //下一结点 ClassNode * next;public: //写字符 void setLetter(char valueLetter); //读字符 char getLetter() const; //amount++ void AmountPlusOne(); //写字符数量 void setAmount(int valueAmount); //读字符数量 int getAmount() const; //写下一结点 void setNext(ClassNode * valueNext); //读下一结点 ClassNode * getNext() const;public: ClassNode(char valueLetter,int valueAmount=0,ClassNode * valueNext=NULL);public: ~ClassNode(void);};然后是类,表示链表:
- C/C++ code
Class ClassList{private: //链表头结点 ClassNode * head;public: //写头结点 void setHead(ClassNode * valueHead); //读头结点 ClassNode * getHead() const; //建立链表 void CreateList(std::string valueContents); //遍历链表 void readList();public: ClassList(std::string valueContents=""); ~ClassList(void);}然后是新建链表函数:问题老是出在这里:
- C/C++ code
//建立NodeLeaf链表void ClassList::CreateList(std::string valueContents){ long length=valueContents.length(); for(int i=0;i<length;i++) { if(getHead()==NULL) //链表为空 { ClassNode * pointer=&ClassNode(valueContents[i],1,NULL); setHead(pointer); cout << "0 " ; } else //链表不为空 { ClassNode * pointer1=getHead(); if(valueContents[i]<pointer1->getLetter()) //节点不存在,插入在head前 { ClassNode * pointer=&ClassNode(valueContents[i],1,NULL); pointer->setNext(pointer1); setHead(pointer); cout << "1 " ; } else { ClassNode * pointer2=pointer1->getNext(); while(1) { if(valueContents[i] == pointer1->getLetter()) //pointer1是所找节点 { pointer1->AmountPlusOne(); cout << "2 " ; break; } else //pointer1不是所找节点 { if(pointer2==NULL) //pointer1是链表最后一个结点 { ClassNode * pointer=&ClassNode(valueContents[i],1,NULL); pointer1->setNext(pointer); cout << "3 " ; break; } else //pointer1不是链表最后一个结点 { //pointer1->getLetter()<valueContents[i]<pointer2->getLetter() if(valueContents[i] < pointer2->getLetter()) { ClassNode * pointer=&ClassNode(valueContents[i],1,NULL); pointer1->setNext(pointer); pointer->setNext(pointer2); cout << "4 " ; break; } else if(valueContents[i] > pointer2->getAmount()) { pointer1=pointer2; pointer2=pointer1->getNext(); cout << "5" ; string in; //cin >> in ; } } } } } } }}
这个新建链表函数参数是一个string类型,将每个字符按照由小递增建立一个链表!
例如:
string contents="acdbb";
链表:(a,1)=>(b,2)=>(c,1)=>(d,1)
麻烦大家帮我把把脉!谢谢!
[解决办法]
//这里好像有问题,应该是if(valueContents[i] 〉 pointer2->getLetter())吧
else if(valueContents[i] > pointer2->getAmount())
{
pointer1=pointer2;
pointer2=pointer1->getNext();
cout << "5" ;
string in;
//cin >> in ;
}
[解决办法]
- C/C++ code
//建立NodeLeaf链表void ClassList::CreateList(std::string valueContents){ long length=valueContents.length(); for(int i=0;i<length;i++) { if(getHead()==NULL) //链表为空 {/* * 这里 ClassNode(valueContents[i],1,NULL) 生成一个临时变量, * 然后把它的地址赋值给 pointer ,并最终作为链表的头,自然要出问题 * 这样试试: */// ClassNode * pointer=&ClassNode(valueContents[i],1,NULL); ClassNode * pointer= new ClassNode(valueContents[i],1,NULL); //析构的时候要 delete setHead(pointer); cout << "0 " ; }//.......
[解决办法]
对,楼上说得对,构造链表时要new出节点来!
[解决办法]
构造函数中要先给head一个指向,才能对head进行操作,一般head = new ClassNode();
[解决办法]
单步看一下
[解决办法]
说实话,我有很多奇怪的地方。
为什么 ClassNode 不把 ClassList 作为友元类?
如果 ClassNode 的所有成员变量都可以任意修改,为什么不直接 public 这些成员变量?否则,应该把 setXXXX() 保护起来。
为什么不把查找、插入的功能提取出来单独写个接口函数?
为什么不用数组要用链表?就算一定要用链表,为什么不事先建立a-z的单元?各个单元的amount初始化为0,然后扫描输入时只要简单计数不更简单吗?
就算要动态插入节点,为什么不让链表一开始就最少拥有一个节点?或更进一步,用:
ClassNode tail(char(255),0,NULL);
ClassNode head(char(0),0,&tail);
或:
ClassNode *head,*tail;
tail = new ClassNode(char(255),0,NULL);
head = new ClassNode(char(0),0,NULL);
这样初始化的链表对简化操作有很大帮助。
老大,这么多层嵌套,看起来很累的……
我把你的程序改写了一下,CreateList 整个过程不过20行代码,VC6下简单的测试了一下:
- C/C++ code
#include <iostream>#include <string>using std::string;using std::cout;using std::endl;class ClassNode;class ClassList;class ClassNode{ friend class ClassList;private: char letter; //字符 int amount; //字符数量 ClassNode * next; //下一结点public: //读字符 char getLetter() const{return letter;} int getAmount() const{return amount;} //读下一结点 const ClassNode * getNext() const{return next;} ClassNode * getNext(){return next;}public: ClassNode(char valueLetter,int valueAmount=0,ClassNode * valueNext=NULL) :letter(valueLetter),amount(valueAmount),next(valueNext){}protected: //写字符 void setLetter(char valueLetter){letter = valueLetter;} //写下一结点 void setNext(ClassNode * valueNext){next = valueNext;} //amount++ void AmountPlusOne(){amount++;} //写字符数量 void setAmount(int valueAmount){amount = valueAmount;} //读字符数量};class ClassList{private: //链表头结点 ClassNode head,tail;public: //写头结点// void setHead(ClassNode * valueHead); //读头结点 ClassNode * getHead(){return head.getNext();} const ClassNode * getHead()const{return head.getNext();} //是否到达链表尾 bool isTail(const ClassNode * ptr)const{return (&tail == ptr);} //建立链表 void CreateList(string valueContents); //遍历链表 void readList(); ClassNode * searchNode(char c); const ClassNode * searchNode(char c)const;public: ClassList(string valueContents=""); virtual ~ClassList(void);};ClassList::ClassList(string valueContents) :head(char(0),0,NULL),tail(char(255),0,NULL){ head.setNext(&tail); CreateList(valueContents);}ClassList::~ClassList(){ ClassNode * currNode,*pnode; for(pnode = currNode = head.getNext();currNode != &tail;pnode = currNode){ currNode = currNode->getNext(); delete pnode; }}ClassNode * ClassList::searchNode(char c){ ClassNode * currNode; unsigned char cc; for(currNode = &head; currNode ;currNode = currNode->getNext()){ cc = currNode->getLetter(); if((unsigned char)c == cc || ((unsigned char)c > cc && (unsigned char)c < (unsigned char)currNode->getNext()->getLetter())) break; } return currNode;}const ClassNode * ClassList::searchNode(char c)const{ const ClassNode *
[解决办法]
一直关注楼主的帖子,现在终于看到问题解决了,楼主能否把最后的正确代码分享一下?
[解决办法]
[解决办法]
[解决办法]
mark