| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 339 人关注过本帖
标题:关于链表的问题
只看楼主 加入收藏
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
结帖率:96.25%
收藏
已结贴  问题点数:20 回复次数:1 
关于链表的问题
一个题目要求函数,写了两三天还是写不出来。原来的类全是模板写的,一部分功能是直接抄书例题的。
因为写不出来,所以把代码简化了,重写了这题需要的功能,不过还是错了。
Line是个线性类,按顺序存储数据。
Chain是个链表类,每个节点ChainNode保存数据和下一个节点的地址。
题目要求是写一个函数调用Insert()和Take()将Line对象的数据放入Chain对象里。
下面代码debug时在Transfrom里面的Insert函返回的非常奇怪,返回主函数的上面的Insert()去了,即使把上面的调用Insert函数去掉。代码执行完毕后还是会错了。
还有我这vc++在debug时碰到cout和new就弹出来一堆东西像内存地址,汇编代码,需要文件之类的东西无法再继续下去了.
#include <iostream>
using namespace std;
class Chain;
class Line
{
    friend Chain;
public:
    Line(int M=10);
    ~Line()
    {delete []element;}
    int Length()
    {return length;}
    void Take(int k,int& x);
    Line& Insert(int k,int x);
    void Output(ostream& out);
private:
    int length;
    int Max;
    int *element;
};

Line::Line(int M)
{
    Max=M;
    element=new int[Max];
    length=0;
}

void Line::Take(int k,int& x)//第k个位置,拿出x
{
    x=element[k];
}

Line& Line::Insert(int k,int x)//第k个位置,放入x
{
    int i;
    if(k>=length)
    {
        Max=2*Max;
        int *n=new int[Max];
        for(i=0;i<length;i++)
            n[i]=element[i];
        delete []element;
        element=n;
    }
    for(i=length;i>=k-1;i--)
        element[i+1]=element[i];
    element[k]=x;
    length++;
    return *this;
}

void Line::Output(ostream& out)
{
    for(int i=0;i<length;i++)
        out<<element[i]<<" ";
    cout<<endl;
}

ostream& operator<<(ostream& out, Line& x)
{
    x.Output(out);
    return out;
}

class Chain;
class ChainIterator;

class ChainNode
{
    friend Chain;
    friend class ChainIterator;
    private:
        int data;
        ChainNode *link;
        
};

class Chain
{
public:
    Chain(){first=0;}
    ~Chain();
    int Length();
    Chain& Insert(int k,int x);
    void Output(ostream& out) ;
    Chain& Transform(Line x);
private:
    ChainNode *first;
};

Chain::~Chain()
{
    ChainNode *t;
    while(first)
    {
        t=first->link;
        delete first;
        first=t;
    }
}

int Chain::Length()//返回长度
{
    int i=0;
    ChainNode *t=first;
    while(t)
    {
        t=t->link;
        i++;
    }
    delete t;
    return i;
}

Chain& Chain::Insert(int k,int x)//第k个位置,插入x
{
    ChainNode *t;
    t=new ChainNode;
    t->data=x;
    t->link=0;
    if(k==0) first=t;
    else
    {
        ChainNode *p=first;
        for(int i=1;i<k&&p;i++)
            p=p->link;
        p->link=t;
    }
    
    return *this;
}

Chain& Chain::Transform(Line x)
{
    int t;
    for(int i=0;i<x.Length();i++)
    {
        x.Take(i,t);
        Insert(i,t);      //从上一行拿出数据存进去应该是没问题的
    }
    return *this;    
}

void Chain::Output(ostream& out)
{
        ChainNode  *current;
    for(current=first;current;current=current->link)
        out<<current->data<<" ";
    cout<<endl;
}

ostream& operator<<(ostream&out,Chain& x)
{
    x.Output(out);
    return out;
}

int main()
{
    Chain a;
    int i;
    for(i=0;i<10;i++)
        a.Insert(i,i+1);//下面的Tranform里的Insert会返回到这个位置是怎么回事?
    cout<<a;
    i=a.Length();
    cout<<i<<endl;
    Line l;
    l.Insert(0,3).Insert(1,2).Insert(2,12).Insert(3,21).Insert(4,4);
    cout<<l;
    Chain b;
    b.Transform(l); //这个函数出问题了
    cout<<b;
    return 0;
}
搜索更多相关主题的帖子: 链表 
2009-08-05 20:26
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:20 
回复 楼主 mfkblue
程序代码:
#include <iostream> 
using namespace std; 
class Chain; 
class Line 
{ 
    friend Chain; 
public: 
    Line(int M=10); 
    ~Line() 
    {delete []element;} 
    int Length() 
    {return length;} 
    void Take(int k,int& x); 
    Line& Insert(int k,int x); 
    void Output(ostream& out); 
private: 
    int length; 
    int Max; 
    int *element; 
}; 

Line::Line(int M) 
{ 
    Max=M; 
    element=new int[Max]; 
    length=0; 
} 

void Line::Take(int k,int& x)//第k个位置,拿出x 
{ 
    x=element[k]; 
} 

Line& Line::Insert(int k,int x)//第k个位置,放入x 
{ 
    int i; 
    if(k>=length)   // 这个的逻辑是不是有点怪?k >= length,只是说它要插入的地方比表长,但并不一定表中的剩余空间就不够用。 
                    // 比如刚开始的时候,表长是M,但lentgh是0.如果程序员想在第1个位置插数,就要倍长这个表吗? 
    { 
        Max=2*Max; 
        int *n=new int[Max]; 
        for(i=0;i<length;i++) 
            n[i]=element[i]; 
        delete []element; 
        element=n; 
    } 
    for(i=length;i>=k-1;i--) 
        element[i+1]=element[i]; 
    element[k]=x; 
    length++; 
    return *this; 
} 

void Line::Output(ostream& out)  
{ 
    for(int i=0;i<length;i++) 
        out<<element[i]<<" "; 
    cout<<endl; 
} 

ostream& operator<<(ostream& out, Line& x) 
{ 
    x.Output(out); 
    return out; 
} 

class Chain; 
class ChainIterator; 

class ChainNode 
{ 
    friend Chain; 
    friend class ChainIterator; 
    private: 
        int data; 
        ChainNode *link; 
         
}; 

class Chain 
{ 
public: 
    Chain(){first=0;} 
    ~Chain(); 
    int Length(); 
    Chain& Insert(int k,int x); 
    void Output(ostream& out) ; 
    Chain& Transform(Line x); 
private: 
    ChainNode *first; 
}; 

Chain::~Chain() 
{ 
    ChainNode *t; 
    while(first) 
    { 
        t=first->link; 
        delete first; 
        first=t; 
    } 
} 

int Chain::Length()//返回长度 
{ 
    int i=0; 
    ChainNode *t=first; 
    while(t) 
    { 
        t=t->link; 
        i++; 
    } 
    delete t; 
    return i; 
} 

Chain& Chain::Insert(int k,int x)//第k个位置,插入x 
{ 
    ChainNode *t; 
    t=new ChainNode; 
    t->data=x; 
    t->link=0; 
    if(k==0) first=t;   // 如果有要链表头插数,是不是要在first指向t之前,把t->link指向原来的表头呢? 
    else 
    { 
        ChainNode *p=first; 
        for(int i=1;i<k&&p;i++) 
            p=p->link; 
        p->link=t; 
    } 
     
    return *this; 
} 

Chain& Chain::Transform(Line x) 
{ 
    int t; 
    for(int i=0;i<x.Length();i++) 
    { 
        x.Take(i,t); 
        Insert(i,t);      //从上一行拿出数据存进去应该是没问题的 
    } 
    return *this;     
} 

void Chain::Output(ostream& out)  
{ 
        ChainNode  *current; 
    for(current=first;current;current=current->link) 
        out<<current->data<<" "; 
    cout<<endl; 
} 

ostream& operator<<(ostream&out,Chain& x) 
{ 
    x.Output(out); 
    return out; 
} 

int main() 
{ 
    Chain a; 
    int i; 
    for(i=0;i<10;i++) 
        a.Insert(i,i+1);//下面的Tranform里的Insert会返回到这个位置是怎么回事? 
    cout<<a; 
    i=a.Length(); 
    cout<<i<<endl;  
    Line l; 
    l.Insert(0,3).Insert(1,2).Insert(2,12).Insert(3,21).Insert(4,4); 
    cout<<l; 
    Chain b; 
    b.Transform(l); //这个函数出问题了 
    cout<<b; 
    return 0; 
} 

暂时就看出了这么点问题,你再改改看~~

还有你说的那个Debug的问题,不要什么都用step(f11),有的用next(f10)就行了。这两个还是有点区别的。

[ 本帖最后由 pangding 于 2009-8-6 17:07 编辑 ]
2009-08-06 17:06
快速回复:关于链表的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027377 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved