| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 707 人关注过本帖
标题:考考你双向链表熟悉程度,help me ,please
只看楼主 加入收藏
lmx07
Rank: 1
等 级:新手上路
帖 子:20
专家分:1
注 册:2009-6-3
结帖率:66.67%
收藏
 问题点数:0 回复次数:6 
考考你双向链表熟悉程度,help me ,please
DuLnode.rar (216.58 KB)

我已经想了两个晚上了,逼不得已才请教大家,双向链表都弄不清楚,实在是愧对党和人民对我的关爱

一直卡在插入这里。
void Du_init( DuLinkList L ){
    L = (DuLinkList)malloc(sizeof(DuLnode));
    L->prior= NULL;
    L->next = NULL;
    L->data=0;
  }

void Du_insert(DuLinkList L , int i , ElemType e ){
    DuLinkList p,q=L->next;
    int k;
    if( L->data == 0 )
    {
        p = (DuLinkList)malloc( sizeof(DuLnode) ) ;
        p->data = e ;
        p->next = NULL ;
        p->prior =L;
        L->next=p;

        printf("\n插入第一个数据成功.\n");
        L->data++;
        return ;
    }
    //if(i==1){
    //    p=(DuLinkList)malloc(sizeof(DuLnode));
    //    p->data = e ;
    //    p->next = L ;
    //    p->prior = NULL;
 //       L->next = p ;
 //       p->prior = L ;
 //       printf("\n第一个位置插入数据成功\n");
 //       L->data++;
    //    return ;
    //}

    for( k = 1 ; k < i ; k++)
        q=q->next ;
        
        p=(DuLinkList)malloc(sizeof(DuLnode));
        p->data = e ;

        p->prior = q->prior ; q->prior->next = p ; //在q前面插入节点插入节点
        p->next = q ; q->next = p ;

    printf("\n插入数据成功.\n");
    L->data++;
}
搜索更多相关主题的帖子: 考考 help please 链表 
2010-03-24 21:05
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
程序代码:
#include<iostream>
#include<cstdlib>
#include<utility>
#include<cassert>
using std::pair;
template<class Type>
class List
{
public:
    struct Node{
        Type val;
        Node():pre(this),next(this){}
        Node(Type key):pre(this),next(this)
            {
                val=key;
            }
        Node(Node &node)
            {
                this->val=node.val;
            }
        Node &operator=(Node & node)
            {
                this->val=node.val;
            }
        ~Node()
            {

            }
        friend std::ostream & operator<<(std::ostream &os,Node &node)
            {
                os<<node.val<<" ";
                return os;
            }
        Node* pre;
        Node* next;
    };
    typedef Node* iter;
    List()
        {
            tail=new Node();
        }
    virtual ~List(){
        destroy();
        assert( tail->next==tail);
        delete tail;
    }
    std::size_t size();
    virtual void insert(Type key);
    virtual void erase(iter it);
    iter begin(){ return tail->next;}
    iter end(){ return tail;}
    void walk();
protected:
    void swap(Node  &n1,Node &n2)
        {
            Node tmp=n1;
            n1=n2;
            n2=tmp;
        }
    void destroy();
private:
    iter tail;
};

template<class Type>
void List<Type>::insert(Type key)
{
    if( NULL==tail )
    {
        tail=new Node(key);
        tail->pre=tail;
        tail->next=tail;
    }
    else
    {
        iter it=new Node(key);
        it->pre=tail->pre;
        it->pre->next=it;
        it->next=tail;
        it->next->pre=it;
    }
}
template<class Type>
void List<Type>::erase(iter it)
{
    it->pre->next=it->next;
    it->next->pre=it->pre;
    delete it;
}
template<class Type>
std::size_t List<Type>::size()
{
    if( tail==tail->next)
        return 0;
    else
    {
        std::size_t sz=0;
        for(iter it=begin();it!=end();it=it->next)
        {
            sz++;
        }
        return sz;
    }
}
template<class Type>
void List<Type>::walk()
{
    iter it=tail;
    if( NULL != tail)
    {
        for(it=tail->next;it!=tail;it=it->next)
        {
            std::cout<<*it<<" ";
        }
        std::cout<<std::endl;
    }
}
template<class Type>
void List<Type>::destroy()
{
    for(List<Type>::iter it=begin();it !=end();it=it->next)
    {
        erase(it);
    }
}
template<class Type>
class Rank:public List<Type>{
public:
    Rank():List<Type>(){}
    void qsort()
        {
            sort(1,List<Type>::size(),List<Type>::begin(),(List<Type>::end())->pre);
        }
    typename List<Type>::Node * _rank_k(int k);
    ~Rank(){}
protected:
    pair<typename List<Type>::Node*,int> 
    partition(int p,int r,typename List<Type>::Node * pt,typename List<Type>::Node* rt)
        {
            Type x=rt->val;
            int i=p-1,j;
            typename List<Type>::Node* it;
            typename List<Type>::Node* jt;
            it=pt->pre;
            jt=pt;
            for(j=p;j<r;j++)
            {
                if(jt->val<=x)
                {
                    i=i+1;
                    it=it->next;
                    swap(*it,*jt);
                }
                jt=jt->next;
            }
            swap(*(it->next),*rt);
            return std::make_pair(it->next,i+1);
        }
    void sort(int p,int r,typename List<Type>::Node* pt,typename List<Type>::Node* rt)
        {
            if( p< r )
            {
                pair<typename List<Type>::Node*,int> qt;
                qt=partition(p,r,pt,rt);
                sort(p,qt.second-1,pt,qt.first->pre);
                sort(qt.second+1,r,qt.first->next,rt);
            }
        }
    typename List<Type>::Node* select(int p,int r,int i,typename List<Type>::Node* pt,typename List<Type>::Node* rt);
}; 
template<class Type>
typename List<Type>::Node * Rank<Type>::_rank_k(int k)
{
    assert(k+1<=List<Type>::size() &&k+1>0);
    return select(1,List<Type>::size(),k+1,List<Type>::begin(),List<Type>::end());
}
template<class Type>
typename List<Type>::Node* 
Rank<Type>::select(int p,int r,int i,typename List<Type>::Node*pt,typename List<Type>::Node * rt)
{
    if( p == r )
    {
        return pt;
    }
    pair<typename List<Type>::Node *,int>qt;
    qt=partition(p,r,pt,rt);
    int k=(qt.second)-p+1;
    if( i == k )
        return qt.first;
    else if( i< k)
        return select(p,qt.second-1,i,pt,qt.first->pre);
    else
        return select(qt.second+1,r,i-k,qt.first->next,rt);
}
int main()
{
    srand(time(NULL));
    Rank<int> rank;
    for(int i=0;i<10;i++)
    {
        int key=rand()%50;
        rank.insert(key);
    }
    rank.walk();
    //std::cout<<rank.size()<<std::endl;
    std::cout<<*(rank._rank_k(5))<<std::endl;
    //rank.qsort();
    //rank.walk();
    return 0;
}


你也别先考我了,先考你自己吧。
2010-03-28 09:03
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
就多了个list而已嘛 楼上的太有才了
2010-03-28 09:21
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
发现现在写代码,总短不下来。。
2010-03-28 09:54
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
学的多了 就考虑周全了 这是好的趋势 求精求全 就可以了 干嘛非要求短了
 不过代码最好带注释了 看的头晕!
2010-03-28 10:00
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
个人觉得,这种级别的代码,暂时还不用注释。

没有什么比较高深的算法。
2010-03-28 10:02
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
2010-03-28 11:20
快速回复:考考你双向链表熟悉程度,help me ,please
数据加载中...
 
   



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

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