| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1585 人关注过本帖
标题:设单链表以非递减有序排列,设计算法删除值相同的多余的结点”求大神修改我 ...
取消只看楼主 加入收藏
玉垒浮云
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-11-22
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:7 
设单链表以非递减有序排列,设计算法删除值相同的多余的结点”求大神修改我的代码
#include<iostream>
using namespace std;
template<class T>
struct Node//循环链表的结点结构体
{
    T data;
    Node<T>*next;
};
template<class T>
class list
{
    public:
        list();
        list(T a[],int n);//建立链表
        ~list();
        int Length(){return length;}
        Node<T>*Index(int i);//按位查找,返回i结点指
        void Delete();//删除操作
        void print();//遍历操作
    private:
        Node<T>*first;//建立头结点
        int length;//表的长度
};
template<class T>//创建一个空表
list<T>::list()
{
    first=new Node<T>;
    first->next=first;
    length=0;
}
template<class T>
list<T>::list(T a[],int n)
{
    Node<T>*s,*r;
    first=new Node<T>;//生成头结点,这一步必不可少,通用的
    r=first;//r也指向头指针,尾指针初始化
    for(int i=0;i!=n;++i)
    {
        //每个数组建立一个结点,赋值
        s=new Node<T>;
        s->data=a[i];
        r->next=s;//将每个节点链在一起
        r=s;
    }
    r->next=first;//尾部结点与头结点相连
    length=n;
}
template<class T>
list<T>::~list()//析构函数将循环链表的所有节点的存储空间释放
{
    Node<T>*q;
    while(!length)
    {
        q=first;
        first=first->next;
        delete q;
    }
    cout<<"链表已经删除"<<endl;
}

template<class T>
Node<T> *list<T>::Index(int i)//按位查找的方法
{
    Node<T> *p;
    p=first->next;
    if(i<0||i>length)
    {
        cout<<"位置"<<i<<"不对"<<endl;
        exit(1);
    }
    if(i==0)
        return first;
    for(int j=1;j<i;++j)
        p=p->next;
    return p;
}

template<class T>
void list<T>::Delete()
{
    Node<T>*q,*p,*s;
    q=new Node<T>;
    s=new Node<T>;
    p=first->next;
    q=p->next;
    s=p;
    for(int i=0;i!=length-1;++i)
        for(int j=1;j!=length;++j)
        {
        
            if(p->data==q->data)
            {
                s->next=q->next;
                delete q;
                length--;
            }
            s=q;
            q=q->next;
        }
}
template<class T>
void list<T>::print()//遍历操作
{
    Node<T>*p;
    p=first->next;
    while(p!=first)
    {
        cout<<p->data<<",";
        p=p->next;
    }
    cout<<endl;
}
void main()
{
    int a[]={11,44,44,44,55,66};
    list<int>mylist(a,6);
    mylist.print();
    cout<<"输出链表的长度"<<mylist.Length()<<endl;
    mylist.Delete();
    mylist.print();
    cout<<"链表的长度"<<mylist.Length()<<endl;
}




编译器没有提示错误,但是mylist.Delete()不能运行,不知道该怎么修改,求大神帮忙
搜索更多相关主题的帖子: public include private void 
2013-04-05 19:01
玉垒浮云
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-11-22
收藏
得分:0 
貌似Delete错了,求大神修改
2013-04-05 19:02
玉垒浮云
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-11-22
收藏
得分:0 
大神呢,求助啊
2013-04-05 21:53
玉垒浮云
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-11-22
收藏
得分:0 
大神呢,求助啊
2013-04-05 21:58
玉垒浮云
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-11-22
收藏
得分:0 
回复 5楼 不玩虚的
大神,把你的算法试了一下,是对的,但是只能删除相邻的啊,还是有欠缺的,我再试一下你楼下的那个
2013-04-06 12:54
玉垒浮云
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-11-22
收藏
得分:0 
回复 6楼 不玩虚的
这个也不对,如果我把之前给的数据换成{11,44.33,44,55,44},输出结果就是{11,44}了,就错了,如果是之前的额那个,所以算法还是有欠缺啊,不过真心谢谢啊
2013-04-06 12:58
玉垒浮云
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-11-22
收藏
得分:0 
回复 9楼 不玩虚的
这次可以了,我也懂了为何之前的那几次错了,谢谢啊
2013-04-06 22:22
玉垒浮云
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-11-22
收藏
得分:0 
这是正确的代码,给下次问同样问题的同学一个参考吧,感谢版主的帮助



#include<iostream>
 using namespace std;
 template<class T>
 struct Node//循环链表的结点结构体
 {
     T data;
     Node<T>*next;
 };
 template<class T>
 class list
 {
     public:
         list();
         list(T a[],int n);//建立链表
         ~list();
         int Length(){return length;}
         Node<T>*Index(int i);//按位查找,返回i结点指
         void Delete();//删除操作
         void print();//遍历操作
     private:
         Node<T>*first;//建立头结点
         int length;//表的长度
 };
 template<class T>//创建一个空表
 list<T>::list()
 {
     first=new Node<T>;
     first->next=first;
     length=0;
 }
 template<class T>
 list<T>::list(T a[],int n)
 {
     Node<T>*s,*r;
     first=new Node<T>;//生成头结点,这一步必不可少,通用的
     r=first;//r也指向头指针,尾指针初始化
     for(int i=0;i!=n;++i)
     {
         //每个数组建立一个结点,赋值
         s=new Node<T>;
         s->data=a[i];
         r->next=s;//将每个节点链在一起
         r=s;
     }
     r->next=first;//尾部结点与头结点相连
     length=n;
 }
 template<class T>
 list<T>::~list()//析构函数将循环链表的所有节点的存储空间释放
 {
     Node<T>*q;
     while(!length)
     {
         q=first;
         first=first->next;
         delete q;
     }
     cout<<"链表已经删除"<<endl;
 }
 
template<class T>
 Node<T> *list<T>::Index(int i)//按位查找的方法
 {
     Node<T> *p;
     p=first->next;
     if(i<0||i>length)
     {
         cout<<"位置"<<i<<"不对"<<endl;
         exit(1);
     }
     if(i==0)
         return first;
     for(int j=1;j<i;++j)
         p=p->next;
     return p;
 }
 
template<class T>
 void list<T>::Delete()
 {
     Node<T>*q,*p,*s,*t;
     t=new Node<T>;
     s=new Node<T>;
     p=first->next;
         
     while(p!=first)
     {        s=t=p;
             q=p->next;
         while(q!=first)
         {
             if(p->data==q->data)
             {   
                t->next=q->next;
                     length--;
            }
         else    t=q;
             q=q->next;
         }
         p=p->next;
     }
 
}//
 template<class T>
 void list<T>::print()//遍历操作
 {
     Node<T>*p;
     p=first->next;
     while(p!=first)
     {
         cout<<p->data<<",";
         p=p->next;
     }
     cout<<endl;
 }
 void main()
 {
     int a[]={1,2,6,5,3,4,6,3,5,4,2,3,1,2,4};
     list<int>mylist(a,15);
     mylist.print();
     cout<<"输出链表的长度"<<mylist.Length()<<endl;
     mylist.Delete();
     mylist.print();
     cout<<"链表的长度"<<mylist.Length()<<endl;
 }
2013-04-06 22:24
快速回复:设单链表以非递减有序排列,设计算法删除值相同的多余的结点”求大神修 ...
数据加载中...
 
   



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

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