C++实现链表操作

来源:互联网 发布:淘宝服装货源怎么找 编辑:程序博客网 时间:2024/05/21 17:53
//写一个类
//要求
//1、使用该类创建一个对象 A a;之后,就自动建立了一个单链表的头
//2、类中的函数:a、可以往单链表中添加一个结点;b、可以将头结点的后继结点删除;
//3、当对象出作用域的时候,自动释放所有单链表的空间
//4、打印方式:C++ cout cin <<endl;
//5、内存申请与释放:new和delete;
//数组操作:
//delete new
//构造,析构

#include <iostream>
#include <Windows.h>

//检查内存泄露的代码
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif


using namespace std;

struct node
{
        int data;
        node *next;
};

class linklist
{
private:
        node *head;
public:
        linklist();
        void create();
        void listlength();
        void addlast();
        void insert();
        void delheadnext();
        void display();
        ~linklist();
};

linklist::linklist()
{
        head = new node;
        head->next = NULL;
}

//后插法建立链表
void linklist::create()
{
        node *p, *q;
        p = head;
        int temp = -1;
        cin>>temp;
        
        while (temp != -1)
        {
                //新节点
                q = new node;
                q->data=temp;
                q->next=NULL;

                //拼接
                p->next = q;
                p = q;
                cin>>temp;
        }
}

//返回链表的长度
void linklist::listlength()
{
        int len = 0;
        node *p = head;

        while (p->next)
        {
                len++;
                p = p->next;
        }
        cout<<endl<<"现在链表的长度是:"<<len<<endl;
}

//在最后插入一个值
void linklist::addlast()
{
        node *p, *q;
        int val;

        cout<<"输入一个值:"<<'\t';
        cin>>val;
        cout<<"在最后插入值val:"<<val<<endl;
        p = head;
        q = new node;
        q->data = val;
        q->next = NULL;
        while (p->next)
        {
                p = p->next;

        }
        p->next = q;
}

//在第pos位置插入一个val
void linklist::insert()
{
        node *p, *q;
        int i, val, pos;

        i = 0;
        cout<<"输入val的值:"<<'\t';
        cin>>val;
        cout<<"输入pos的值:"<<'\t';
        cin>>pos;
        cout<<"在"<<pos<<"后插入值:"<<val<<endl;
        p = head;
        while(pos > 0 && i< pos) {
                while (p && i < pos)
                {
                        p = p->next;
                        ++i;
                }
                q = new node;
                q->data = val;
                q->next = p->next;
                p->next = q;
        }
}

//删除头结点之后的节点
void linklist::delheadnext()
{
        cout<<"删除头结点之后的后继结点之后:"<<endl;
        node *p;

        //p=NULL
        if(head->next)
        {
                p=head->next;
                head->next= head->next->next;
                delete p;
                p=NULL;
        }

}

//显示链表
void linklist::display()
{
        node *p=head;
        while (p->next)
        {
                cout<<p->next->data;
                p = p->next;
                cout<<'\t';
        }
        listlength();
        cout<<endl;
}

linklist::~linklist()
{
        node *p;
        while (head->next)
        {
                p = head;
                head = head->next;
                delete p;
                p=NULL;
        }
        delete head;
        head=NULL;
}

int main()
{

        linklist list;

        cout<<"输入链表:"<<endl;
        list.create();
        list.display();

        list.addlast();
        list.display();

        list.insert();
        list.display();
                
        list.delheadnext();
        list.display();

        _CrtDumpMemoryLeaks();

        system("pause");
        return 0;
}
原创粉丝点击