首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++,大家帮小弟我看看,这个新建链表函数有什么有关问题

2012-03-20 
c++,大家帮我看看,这个新建链表函数有什么问题?大家帮我看看,这个新建链表函数有什么问题?小弟不才,我实在

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 * 


[解决办法]
一直关注楼主的帖子,现在终于看到问题解决了,楼主能否把最后的正确代码分享一下?
[解决办法]

探讨
首先谢谢rushman ,对我的帖子这么认真!
引用:
说实话,我有很多奇怪的地方。
为什么 ClassNode 不把 ClassList 作为友元类?
如果 ClassNode 的所有成员变量都可以任意修改,为什么不直接 public 这些成员变量?否则,应该把 setXXXX() 保护起来。
为什么不把查找、插入的功能提取出来单独写个接口函数?
为什么不用数组要用链表?就算一定要用链表,为什么不事先建立a-z的单元?各个单元的amount初…

[解决办法]
探讨
引用:
一直关注楼主的帖子,现在终于看到问题解决了,楼主能否把最后的正确代码分享一下?

我自己的代码其实用到继承的!为了提问方便,我重新整理过之后上来发帖的!你留个邮箱,我发给你整理过的!

[解决办法]
mark

热点排行