C++实现单链表的基本操作(借鉴站内一些博客自己加些东西写了一份)

头文件


#ifndef LINKLIST_H_INCLUDED

#define LINKLIST_H_INCLUDED



typedef char DataType;

#define Node ElemType

//定义一个节点类

class Node

{

public:

    DataType data;     //数据域

    Node * next;  //指针域

};



//定义一个单链表类



class LinkList

{

public:



    LinkList();                      //构建一个单链表的表头;



    ~LinkList();                  //销毁一个单链表;



    void CreateLinkList(int n);   //创建一个单链表



    void TravalLinkList();        //遍历线性表



    int GetLength();              //获取线性表长度



    bool IsEmpty();               //判断单链表是否为空



    ElemType * Find(DataType data); //查找节点



    void InsertElemAtEnd(DataType data);            //在尾部插入指定的元素



    void InsertElemAtIndex(DataType data,int n);    //在指定位置插入指定元素



    void InsertElemAtHead(DataType data);           //在头部插入指定元素



    void DeleteElemAtEnd();       //在尾部删除元素



    void DeleteAll();             //删除所有数据



    void DeleteElemAtPoint(DataType data);     //删除指定的数据



    void DeleteElemAtHead();      //在头部删除节点



    void output_Linklist(int n);//输出指定位置元素.


   void query_Linklist(DataType n);//输出指定元素位置.



private:



    ElemType * head;              //head存储头结点的地址吧



};







#endif // LINKLIST_H_INCLUDED

CPP文件


#define Maxsize 1000

#include<iostream>

#include"Linklist.h"

#include<stdlib.h>

using namespace std;
int key,key1;

//构建单链表

LinkList::LinkList()

{

    head = new ElemType;//new一个结点并返回该引用;

    head->data='0';

    head->next=nullptr;

}

//摧毁单链表

LinkList::~LinkList()

{

    delete head;

}

//创建一个单链表

void LinkList::CreateLinkList(int n)

{

    ElemType *pnew,*ptemp;//两个结点类型的指针变量.用来存节点的地址



    ptemp = head;//将头节点的地址赋值给交换指针

    if(n<=0||n>Maxsize)

    {

        cout<<"输入节点个数有误"<<endl;

    }

    cout<<"请依次输入"<<n<<"元素:";

    for(int i=0;i<n;i++)

    {

        pnew =new ElemType;//创建新结点

        cin>>pnew->data;

        pnew->next = nullptr;//新结点指针域为空指针

        ptemp->next = pnew;//存刚刚创建节点的地址.(第一次时,把刚创建的节点的地址传给头指针的指针域)              )

        ptemp = pnew;//(使ptemp指向刚刚创建的结点)

    }

}

//遍历单链表

void LinkList::TravalLinkList()

{

    if(head==nullptr||head->next==nullptr)

    {

        cout<<"该表为空表!"<<endl;

    }

    else

    {

        cout<<"链表中的数据依次为:";

        ElemType *p =head->next;

        while(p!=nullptr)

        {

            cout<<p->data<<'\t';

            p = p->next;

        }

    }

}

//获取单链表长度

int LinkList::GetLength()

{

    int count=0;

    ElemType *p = head->next;

    while(p!=nullptr)

    {

        count++;

        p=p->next;

    }

    return count;

}

//判断链表是否为空

bool LinkList::IsEmpty()

{

    if(head==nullptr||head->next==nullptr)

    {

        cout<<"该表为空表!"<<endl;

        return 0;

    }

}

//在链表中查找元素

ElemType *LinkList::Find(DataType num)

{
    ElemType *p=head->next;

    if(p == nullptr)

    {

        cout<<"该表为空表"<<endl;

        return p;

    }

    else

    {

        while(p!=nullptr)

        {
            key++;

            if(p->data==num)
            {
              key1 = key;
                return p;
            }


            else

                p=p->next;

        }

        cout<<"在链表中未找到该元素"<<endl;

        return nullptr;

    }

}

//在链表尾部插入元素

void LinkList::InsertElemAtEnd(DataType num)

{

    ElemType * newNode = new ElemType;//创建一个新结点.

    newNode->data = num;

    newNode->next = nullptr;

    ElemType *ptemp=head;

    while(ptemp->next!=nullptr)//找到最末尾的元素.

    {

            ptemp=ptemp->next;

    }

    ptemp->next=newNode;

}

//在链表任意指定位置插入元素(结点).

void LinkList::InsertElemAtIndex(DataType num,int n)

{

    if(n<0||n>GetLength())

    {

        cout<<"插入位置不合理!"<<endl;

    }

    else

    {

    ElemType * newNode = new ElemType;//创建一个新结点.

    newNode->data = num;

    newNode->next = nullptr;



    ElemType *ptemp=head;//目前ptemp指向表头

    int count=1;

    while(count<=n)//找到要插入位置的结点

    {

        ptemp=ptemp->next;

        count++;

    }

        newNode->next=ptemp->next;//将插入位置结点的指针域中的地址赋值给新结点的指针域.

        ptemp->next=newNode;//将新结点的地址赋值给位置节点的指针域.

    }

}

//在链表头部插入指定元素

void LinkList::InsertElemAtHead(DataType num)

{

    //creat_newcode

    ElemType*newNode = new ElemType;

     newNode->next=head->next;

     head->next=newNode;//将新结点地址传给表头指针域.

}

//删除尾部元素

void LinkList::DeleteElemAtEnd()

{

    ElemType *p=head;

    ElemType *ptemp = nullptr;

    if(p->next==nullptr)

        cout<<"该表为空!"<<endl;

    else

    {

        while(p->next!=nullptr)//循环结束时,ptemp存的是尾部上一个元素的地址.

        {

            ptemp=p;//将该结点的地址给ptemp

            p=p->next;//指针p沿链cout<<"9.删除头部元素"<<endl;表移动指向下一节点.

        }

        delete p;

        p = nullptr;

        ptemp->next = nullptr;

    }

}

//删除指定元素

void LinkList::DeleteElemAtPoint(DataType num)

{

    ElemType *ptemp=Find(num);

    if(ptemp == head->next)

    {

        DeleteElemAtHead();

    }

    else

    {

        ElemType *p = head;

        while(p->next!=ptemp)

        {

            p= p->next;

        }

        p->next = ptemp->next;

        delete ptemp;

        ptemp =nullptr;

    }

}

void LinkList::DeleteElemAtHead()

{
    cout<<"构建单链表"<<endl;

    ElemType*p = head;

    if(p==nullptr||p->next==nullptr)

        cout<<"该链表为空!"<<endl;

    else

    {

            ElemType*ptemp=head->next;

            delete p;

            p=nullptr;

            head =ptemp;



    }

}
//输出指定位置元素.
void LinkList::output_Linklist(int n)
{
    ElemType*p=head;
    if(p->next==nullptr)
        cout<<"该表为空表"<<endl;
    else
    {
        while(n--)
        {
            p=p->next;
        }
        cout<<"该位置的元素为:"<<p->data<<endl;
    }
}
void LinkList::query_Linklist(DataType n)
{
  ElemType* p = Find(n);
  if(p!=nullptr&&key1!=0)
    cout<<"该元素"<<n<<"的位置为:"<<key1;
}
int main()

{

        LinkList P;//创建一个链表对象.

        int num;

        while(1)

        {

        cout<<"1.创建一个长度为n的单链表"<<endl;

        cout<<"2.遍历输入单链表"<<endl;

        cout<<"3.获取单链表长度"<<endl;

        cout<<"4.判断单链表是否为空"<<endl;

        cout<<"5.查找结点(返回的是地址)"<<endl;

        cout<<"6.在链表尾部插入指定元素"<<endl;

        cout<<"7.删除尾部元素"<<endl;

        cout<<"8.删除指定元素"<<endl;

        cout<<"9.删除头部元素"<<endl;

        cout<<"10.查询指定位置的元素"<<endl;

        cout<<"11.查询指定元素的位置"<<endl;

        cout<<"12.中止程序退出!"<<endl;

        cout<<"请选择你需要执行的功能:";
        cin>>num;

        switch(num)

        {

        case 1:

            cout<<"输入n:";

            int n;

            cin>>n;

            P.CreateLinkList(n);

            break;

        case 2:

            P.TravalLinkList();

            cout<<endl;

            break;

        case 3:

            cout<<"该链表长度为:"<<P.GetLength()<<endl;

            break;

        case 4:

            if(!P.IsEmpty())

            cout<<"该链表不为空,该表长度为:"<<P.GetLength()<<endl;

            break;

        case 5:

            cout<<"输入要查找的元素:";

            DataType a;

            cin>>a;

            P.Find(a);

            cout<<endl;

            break;

        case 6:

            cout<<"输入在链表尾部插入指定元素:"<<endl;

            DataType num;

            cin>>num;

            P.InsertElemAtEnd(num);

            cout<<endl;

            break;

        case 7:

            P.DeleteElemAtEnd();

            cout<<"表尾元素已删除!"<<endl;

            break;

        case 8:

            cout<<"输入要删除指定元素:"<<endl;

            DataType num1;

            cin>>num1;

            P.DeleteElemAtPoint(num1);

            cout<<endl;

            break;

        case 9:

            P.DeleteElemAtHead();

            cout<<"头部元素已删除"<<endl;

            break;

        case 10:
            cout<<"输入要输出链表的指定位置:"<<endl;

            int num2;

            cin>>num2;

            P.output_Linklist(num2);
             break;
        case 11:
            cout<<"输入要查询元素:"<<endl;

            key1=0,key=0;
            DataType num3;

            cin>>num3;

            P.query_Linklist(num3);

            cout<<endl;
             break;
        case 12:
              exit(0);


        }

        }

}




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值