当前位置: 代码迷 >> C语言 >> 没人帮忙哦,飞燕帮我来看下哪里错了啊
  详细解决方案

没人帮忙哦,飞燕帮我来看下哪里错了啊

热度:323   发布时间:2008-04-20 10:08:06.0
我发个用C++写的双向链表(自己做的):

程序代码:

#ifndef _LIST_H
#define _LIST_H

#include <windows.h>

//////////////////////////////////////////////////////////////////////////
//节点的结构
struct node
{
    void *data;
    node *last;
    node *next;
};

//////////////////////////////////////////////////////////////////////////
//链表类
class CList
{
public:
    //////////////////////////////////////////////////////////////////////////
    //初始化链表
    CList()
    {
        m_curNode = NULL;    //为NULL则说明没有节点
        m_curPos = -1;        //为-1也说明没有节点
    }

    //////////////////////////////////////////////////////////////////////////
    //在当前节点的左边插入一个新节点
    void *insertLeft(void *dat)
    {
        node *newNode = new node;
        newNode->data = dat;
        newNode->last = NULL;
        newNode->next = NULL;

        if(!m_curNode)
        {
            m_curNode = newNode;
            m_curPos = 0;
        }
        else
        {
            node *oldNode = m_curNode->last;
            if(oldNode) oldNode->next = newNode;
            newNode->last = oldNode;
            newNode->next = m_curNode;
            m_curNode->last = newNode;
            m_curNode = newNode;
        }
        return m_curNode->data;
    }

    //////////////////////////////////////////////////////////////////////////
    //在当前节点的右边插入一个新节点
    void *insertRight(void *dat)
    {
        node *newNode = new node;
        newNode->data = dat;
        newNode->last = NULL;
        newNode->next = NULL;
        
        if(!m_curNode)
        {
            m_curNode = newNode;
            m_curPos = 0;
        }
        else
        {
            node *nextNode = m_curNode->next;
            if(nextNode) nextNode->last = newNode;
            newNode->last = m_curNode;
            newNode->next = nextNode;
            m_curNode->next = newNode;
            m_curNode = newNode;
            m_curPos ++;
        }
        return m_curNode->data;
    }

    //////////////////////////////////////////////////////////////////////////
    //删除当前节点
    short deleteNode()
    {
        if(!m_curNode)return 0;
        else
        {
            node *last = m_curNode->last;
            node *next = m_curNode->next;
            if(last) last->next = next;
            if(next) next->last = last;
            
            delete m_curNode;
            m_curNode = NULL;
            
            if(last)
            {
                m_curNode = last;
                m_curPos --;
                return 1;
            }
            else if(next)
            {
                m_curNode = next;
                return 2;
            }
            else
            {
                m_curNode = NULL;
                m_curPos = -1;
                return 0;
            }
        }
    }

    //////////////////////////////////////////////////////////////////////////
    //删除所有节点
    int delAllEx()
    {
        int cnt = 0;
        moveFirst();
        node *tmp = m_curNode;

        do
        {
            deleteNode();
            cnt++;
        } while (tmp = moveRight());

        deleteNode();
        m_curPos = -1;
        cnt++;

        return cnt;
    }

    //////////////////////////////////////////////////////////////////////////
    //删除所有节点(最快)
    int delAll()
    {
        int cnt = 0;
        do cnt ++;
        while (deleteNode());
        return cnt;
    }

    //////////////////////////////////////////////////////////////////////////
    //当前节点往左移动
    node *moveLeft()
    {
        if(!m_curNode)
        {
            m_curPos = -1;
            return NULL;
        }
        else
        {
            node *tmp = m_curNode->last;
            if(tmp)
            {
                m_curNode = tmp;
                m_curPos --;
                return m_curNode;
            }
            else return NULL;
        }
    }

    //////////////////////////////////////////////////////////////////////////
    //当前节点往右移动
    node *moveRight()
    {
        if(!m_curNode)
        {
            m_curPos = -1;
            return NULL;
        }
        else
        {
            node *tmp = m_curNode->next;
            if(tmp)
            {
                m_curNode = tmp;
                m_curPos ++;
                return m_curNode;
            }
            else return NULL;
        }
    }

    //////////////////////////////////////////////////////////////////////////
    //当前节点移动到最前
    node *moveFirst()
    {
        while(moveLeft())
        {}
        return m_curNode;
    }

    //////////////////////////////////////////////////////////////////////////
    //当前节点移动到最后
    node *moveEnd()
    {
        while(moveRight())
        {}
        return m_curNode;
    }

    //////////////////////////////////////////////////////////////////////////
    //循环移动当前节点,v为正则往右,负则往左,0则不移动
    void loopMove(int v)
    {
        int idx = 0;
        if(v < 0)
        {
            idx = abs(v);
            for(int i = 0; i < idx; i++)
                moveLeft();
        }
        else if(v > 0)
        {
            idx = abs(v);
            for(int i = 0; i < idx; i++)
                moveRight();
        }
    }

    //////////////////////////////////////////////////////////////////////////
    //当前节点移动到idx位置
    void moveTo(int idx)
    {
        int a = idx - m_curPos;
        loopMove(a);
    }

    //////////////////////////////////////////////////////////////////////////
    //获得当前节点
    node *getCurNode()
    {
        return m_curNode;
    }

    //////////////////////////////////////////////////////////////////////////
    //获得当前节点的位置
    int getCurPos()
    {
        return m_curPos;
    }

    //////////////////////////////////////////////////////////////////////////
    //获得当前节点的data指针
    void *getCurData()
    {
        if(!m_curNode) return NULL;
        else return m_curNode->data;
    }

    //////////////////////////////////////////////////////////////////////////
    //重载等于运算符,把另一个链表复制到此链表
    void operator = (CList lst)
    {
        lst.moveFirst();
        do insertRight(lst.getCurData());
        while (lst.moveRight());
        moveFirst();    //置于最前
    }

    //////////////////////////////////////////////////////////////////////////
    //获得链表中总共有多少个节点
    //这个会把curPos改变,但是速度更快
    int getNumEx()
    {
        moveEnd();
        return m_curPos + 1;
    }

    //////////////////////////////////////////////////////////////////////////
    //这个能保持curPos,但是速度较慢
    int getNum()
    {
        int oldCur = m_curPos;
        moveEnd();
        int ret = m_curPos + 1;
        moveTo(oldCur);
        return ret;
    }
private:
    node    *m_curNode;    //当前节点
    int        m_curPos;    //当前节点的位置
};

#endif

----------------解决方案--------------------------------------------------------
燕子,昨天我这里停电了。
所以后来就没看到你的回帖了。这么久才回应你的回帖,很是不好意思啊。
修改得那么详细,先谢谢你哈。
可以帮我再解释下你那些改动的地方么。看了好久,就是不知道为什么这么改啊。
(1)creat函数。为什么要定义两个变量:n,s输入呢,我原来的scanf("%ld %ld",&p1->num,&p1->score);为什么行不通啊?
   为什么把输入语句至于while()中――“ while(scanf("%ld %ld",&n,&s)!=EOF && n!=0)”?
(2)print() 和main() 中的while()都改成了for(),这又是为什么啊?
最后我原代码不能实现题目要求的主要原因是什么啊?
----------------解决方案--------------------------------------------------------
LS的LS, 这里是C你怎么发C++呢///
----------------解决方案--------------------------------------------------------
大哥我还么学过C++ 呢,HOHO
不过感觉应该是好东西,先收藏了哈,呵呵。
以后学了,再拿出来看看。
----------------解决方案--------------------------------------------------------
谁知道我12# 的问题啊,
懂的帮我看看,解释下哦。
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]zyhfbim1a9[/un] 在 2008-4-20 10:25 的发言:[/bo]
(1)creat函数。为什么要定义两个变量:n,s输入呢,我原来的scanf("%ld %ld",&p1->num,&p1->score);为什么行不通啊?
   为什么把输入语句至于while()中――“ while(scanf("%ld %ld",&n,&s)!=EOF && n!=0)”?
(2)print() 和main() 中的while()都改成了for(),这又是为什么啊?
最后我原代码不能实现题目要求的主要原因是什么啊?

1. 不这样的话,像你那样,出现内存泄露(多余分配且没有加入链表内)
   输入写在while里,少重复写一次输入并且方便控制
2. while改for只为了简短些,并且让结构关系显现
3. 你的代码的数据结构不存在一个独立的头指针,所以插入操作不能插入在最开头
   所以几乎要重写,加上你原来的代码逻辑混乱

其它:最好你自己加上链表释放的代码。。。


----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]雨中秣燕[/un] 在 2008-4-20 11:30 的发言:[/bo]


1. 不这样的话,像你那样,出现内存泄露(多余分配且没有加入链表内)
   输入写在while里,少重复写一次输入并且方便控制
2. while改for只为了简短些,并且让结构关系显现
3. 你的代码的数据结构不存在一个独立的头指针,所以 ...

     怎么加入一个独立的头指针啊。
----------------解决方案--------------------------------------------------------
带头指针:
head->数据->数据->数据-NULL

不带头
数据(head)->数据->数据-NULL

你重新看看链表部分


----------------解决方案--------------------------------------------------------
  相关解决方案