自己实现一个C++链表类(包含增删改查,冒泡排序,尾插法操作)

特点:有一个空的头节点,不包含有效数据

//链表复习
//自己实现C++链表类
#include <iostream>
using namespace std;
//创建节点类
class Node
{
    //需要声明为公共成员,因为c++类默认为私有
public:
    int data;
    Node* next;
};


//创建链表类
class LinkedList
{
private:
    Node *head;
public:
    //首先是构造函数,无参构造是先搞定头节点,用尾插法后面再插入元素
    LinkedList()
    {
        head = new Node;
        head->next = NULL;
    }
    //有参构造
    LinkedList(int num)
    {
        //通过键盘输入存入链表
        head = new Node;
        Node* pre = head;
        for(int i=0;i<num;i++)
        {
            Node* p = new Node;
            cin>>p->data;
            p->next=NULL;
            pre->next = p;
            pre = p;
        }
    }
    //尾插法添加元素
    void append(int num)
    {
        //要考虑到一个链表只有头节点的情况
        if(head->next == NULL)
        {
            Node *p = new Node;
            p->data = num;
            p->next = NULL;
            head->next = p;
            return;
        }
        Node *p=NULL;
        for(p=head->next;p->next!=NULL;p=p->next){}
        Node *end = new Node;
        end->data = num;
        end->next = NULL;
        p->next = end;
    }
    //遍历链表
    void displayList()
    {
        for(Node* p=head->next;p!=NULL;p=p->next)
        {
            cout<<p->data<<" ";
        }
        cout<<endl;
    }
    //在指定的位置添加元素
    void addElementAt(int data,int num)
    {
        int i=0;
        Node *pre=NULL;
        for(pre=head;i<num;pre=pre->next,i++){}//先要到达指定位置的前一个节点
        Node* p=new Node;
        p->data = data;
        p->next = pre->next;
        pre->next = p;
    }
    //链表指定位置删除元素
    void deleteElement(int num)
    {
        int i=0;
        Node *pre = NULL;
        for(pre=head;i<num;pre=pre->next,i++){}//先要到达指定位置的前一个节点
        Node *p =pre->next;//提前先记下被删除节点的地址值,方便之后进行delete操作
        pre->next=pre->next->next;
        delete p;
    }
    //链表指定位置改变数值
    void SetData(int num,int data)
    {
        int i=0;
        Node *p=NULL;
        for(p=head->next;i<num;p=p->next,i++){}
        p->data = data;
    }
    //链表指定位置查看
    void viewData(int num)
    {
        int i=0;
        Node* p=NULL;
        for(p=head->next;i<num;p=p->next,i++){}
        cout<<p->data<<endl;
    }
    //链表的冒泡排序
    void BubbleSortList()
    {
        Node* end=NULL;
        //先确定好end的初识值
        for(Node* p=head->next;p!=NULL;p=p->next)
        {
            if(p->next == NULL)
            {
                end=p;
            }
        }
        for(Node* p=head->next;p->next!=NULL;p=p->next)
        {
            for(Node* q=head->next;q!=end;q=q->next)
            {
                if(q->data>q->next->data)
                {
                    //只用交换数据即可
                    int tmp;
                    tmp=q->next->data;
                    q->next->data=q->data;
                    q->data=tmp;
                }
            }
            for(Node* q=head->next;q!=end;q=q->next)
            {
                if(q->next == end)
                {
                    end=q;
                    break;
                }
            }
        }
    }
};

//创建链表的函数
//创建的链表在堆上,只需输入参数要生成多少个节点即可,返回头节点的地址
Node* createList(int num)
{
    //通过键盘输入存入链表
    Node* head = new Node;
    Node* pre = head;
    for(int i=0;i<num;i++)
    {
        Node* p = new Node;
        cin>>p->data;
        p->next=NULL;
        pre->next = p;
        pre = p;
    }
    return head;
}

//在尾部添加数据(尾插法)
void append(int num,Node* head)
{
    //要考虑到一个链表只有头节点的情况
    if(head->next == NULL)
    {
        Node *p = new Node;
        p->data = num;
        p->next = NULL;
        head->next = p;
        return;
    }
    Node *p=NULL;
    for(p=head->next;p->next!=NULL;p=p->next){}
    Node *end = new Node;
    end->data = num;
    end->next = NULL;
    p->next = end;
}

//遍历链表数据
void displayList(Node* head)
{
    for(Node* p=head->next;p!=NULL;p=p->next)
    {
        cout<<p->data<<" ";
    }
    cout<<endl;
}

//链表指定位置添加元素
void addElementAt(int data,int num,Node *head)
{
    int i=0;
    Node *pre=NULL;
    for(pre=head;i<num;pre=pre->next,i++){}//先要到达指定位置的前一个节点
    Node* p=new Node;
    p->data = data;
    p->next = pre->next;
    pre->next = p;
}

//链表指定位置删除元素
void deleteElement(int num,Node*head)
{
    int i=0;
    Node *pre = NULL;
    for(pre=head;i<num;pre=pre->next,i++){}//先要到达指定位置的前一个节点
    Node *p =pre->next;//提前先记下被删除节点的地址值,方便之后进行delete操作
    pre->next=pre->next->next;
    delete p;
}

//链表指定位置改变数值
void SetData(int num,int data,Node* head)
{
    int i=0;
    Node *p=NULL;
    for(p=head->next;i<num;p=p->next,i++){}
    p->data = data;
}

//链表指定位置查看
void viewData(int num,Node* head)
{
    int i=0;
    Node* p=NULL;
    for(p=head->next;i<num;p=p->next,i++){}
    cout<<p->data<<endl;
}


//链表的冒泡排序
void BubbleSortList(Node *head)
{
    Node* end=NULL;
    //先确定好end的初识值
    for(Node* p=head->next;p!=NULL;p=p->next)
    {
        if(p->next == NULL)
        {
            end=p;
        }
    }
    for(Node* p=head->next;p->next!=NULL;p=p->next)
    {
        for(Node* q=head->next;q!=end;q=q->next)
        {
            if(q->data>q->next->data)
            {
                //只用交换数据即可
                int tmp;
                tmp=q->next->data;
                q->next->data=q->data;
                q->data=tmp;
            }
        }
        for(Node* q=head->next;q!=end;q=q->next)
        {
            if(q->next == end)
            {
                end=q;
                break;
            }
        }
    }
}

void test01()
{
    Node* head = createList(10);
    BubbleSortList(head);
    displayList(head);
    addElementAt(11,1,head);
    displayList(head);
    deleteElement(1,head);
    displayList(head);
    SetData(2,2,head);
    displayList(head);
    viewData(3,head);
    append(100,head);
    displayList(head);
}

void test02()
{
    LinkedList list(10);
    list.BubbleSortList();
    list.displayList();
    list.addElementAt(11,1);
    list.displayList();
    list.deleteElement(2);
    list.displayList();
    list.SetData(2,2);
    list.displayList();
    list.viewData(3);
    list.append(100);
    list.displayList();
}

//测试
int main()
{
    freopen("In.txt","r",stdin);
    test02();
    return 0;
}

本次笔记为本人学习数据结构时复习前面学过的链表有感而发,如有错误请各位大佬指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值