用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

C++链表的相关操作(建立、插入、删除、查找、逆置)

2013-06-20 作者: 德良举报

[c++]代码库

#include<iostream>
using namespace std;
typedef int T;
class List{
    struct Node{
        T data;
        Node *next;
        Node(const T&d):data(d),next(NULL){}
        //Node(){}
    };
    Node *head;
    int len;
public:
    List():len(0),head(NULL){}
     
    void push_front(const T&d)//头插法
    {
        Node *p=new Node(d);
        if(head==NULL) head=p;
        else
        {
            p->next=head;//使p和head指向相同
            head=p;
        }
    }
     
    void push_back(const T&d)//尾插法
    {
        static Node *r;//防止r在出了这个作用域之后就释放
        Node *p=new Node(d);
        if(head==NULL) {head=p;r=p;}
        else
        {
            r->next=p;
            r=p;
            r->next=NULL;
        }
    }
 
    Node *&getptr(int pos)//得到指定链表中的位置
    {
        if(pos<0) pos=0;
        if(pos==0) return head;
        Node *p=head;
        for(int i=0;i<pos-1;i++)
            p=p->next;
        return p->next;
    }
     
    void insert(const T&d,int pos)//在任意位置插入
    {
        Node *&pn=getptr(pos);
        Node *p=new Node(d);
        p->next=pn->next;
        pn->next=p;
    }
     
    int Num()//统计结点个数
    {
        Node *p=head;
        int cnt=0;
        while(p)
        {
            cnt++;
            p=p->next;
        }
        return cnt;
    }
 
    void clear()//清空链表
    {
        while(head)
        {
            Node *p=head->next;
            delete head;
            head=p;
        }
    }
 
    void erase(int pos)//删除指定位置的元素
    {
        if(pos<0) return;
        Node *&p=getptr(pos);//引用保证是原始指针
        Node *pn=p;
        p=p->next;
        delete pn;
    }
     
    void remove(const T&d)//删除指定元素
    {
        int pos=0;
        Node *p=head;
        while(p)
        {
            if(p->data==d)
            {
                erase(pos);
                return;
            }
            p=p->next;
            pos++;
        }
    }
     
    void set(int pos,const T& d)//修改指定位置处的元素
    {
        if(pos<0) return;
        getptr(pos)->data=d;
    }
     
    void revise()//单链表的逆置
    {
        Node  *p,*q;
        p=head->next;
        head->next=NULL;
        while(p!=NULL)
        {
            q=p->next;
            p->next=head;
            head=p;
            p=q;
        }
    }  
 
    void print()//输出
    {
        Node *p=head;
        while(p)
        {
            cout<<p->data<<' ';
            p=p->next;
        }
        cout<<endl;
    }
};
 
int main()
{
    List l;
    /*
    l.push_front(1);
    l.push_front(2);
    l.push_front(3);
    l.push_front(4);
    l.print();
    */
    l.push_back(5);
    l.push_back(6);
    l.push_back(7);
    l.push_back(8);
    l.insert(9,1);
    l.insert(10,2);
    l.print();//5 6 9 10 7 8
    cout<<"Num="<<l.Num()<<endl;
    l.erase(1);
    l.print();//5 9 10 7 8
    l.remove(9);
    l.print();//5 10 7 8
    l.set(1,3);
    l.print();//5 3 7 8
    l.revise();
    l.print();//8 7 3 5
    l.clear();
    cout<<"Num="<<l.Num()<<endl;
    return 0;
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...