C++语言程序设计:C++实现单链表的12种基本操作
安安 2017-09-12 来源 :网络 阅读 1285 评论 0

摘要:本篇C++语言程序教程将为大家讲解C++实现单链表的12种基本操作,看完这篇文章会让你对C++语言程序编程的知识点有更加清晰的理解和运用。

本篇C++语言程序教程将为大家讲解C++实现单链表的12种基本操作,看完这篇文章会让你对C++语言程序编程的知识点有更加清晰的理解和运用。

  

C++单链表的操作

2017-12-25

// 单链表.cpp: 定义控制台应用程序的入口点。

//Author:kgvito

//Date: 2017.12.25

 

 

#include "stdafx.h"

#include<iostream>

using namespace std;

 

typedef int DataType;

#define Node ElemType

#define ERROR NULL

 

//构建一个节点类

class Node                          

{

public:

    int 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();      //在头部删除节点

private:

    ElemType * head;              //头结点

};

 

//初始化单链表

LinkList::LinkList()                  

{

    head = new ElemType;            

    head->data = 0;               //将头结点的数据域定义为0

    head->next = NULL;            //头结点的下一个定义为NULL

}     

 

//销毁单链表

LinkList::~LinkList()

{

    delete head;                 //删除头结点

}

 

//创建一个单链表

void LinkList::CreateLinkList(int n)

{

    ElemType *pnew, *ptemp;

    ptemp = head;

    if (n < 0) {       //当输入的值有误时,处理异常

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

        exit(EXIT_FAILURE);

    }

    for (int i = 0; i < n;i++) {        //将值一个一个插入单链表中

        pnew = new ElemType;

        cout << "请输入第" << i + 1 << "个值: " ;

        cin >> pnew->data;

        pnew->next = NULL;          //新节点的下一个地址为NULL

        ptemp->next = pnew;         //当前结点的下一个地址设为新节点

        ptemp = pnew;               //将当前结点设为新节点

    }

}

 

//遍历单链表

void LinkList::TravalLinkList()

{

    if (head == NULL || head->next ==NULL) {

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

    }

    ElemType *p = head;                 //另指针指向头结点

    while (p->next != NULL)        //当指针的下一个地址不为空时,循环输出p的数据域

    {

        p = p->next;               //p指向p的下一个地址

        cout << p->data << " ";

    }

}

 

//获取单链表的长度

int LinkList::GetLength()

{

    int count = 0;                  //定义count计数

    ElemType *p = head->next;           //定义p指向头结点

    while (p != NULL)                //当指针的下一个地址不为空时,count+1

    {

        count++;                  

        p = p->next;                //p指向p的下一个地址

    }

    return count;                   //返回count的数据

}

 

//判断单链表是否为空

bool LinkList::IsEmpty()

{

    if (head->next == NULL) {                 

        return true;

    }

    return false;

}

 

//查找节点

ElemType * LinkList::Find(DataType data)

{

    ElemType * p = head;

    if (p == NULL) {                           //当为空表时,报异常

        cout << "此链表为空链表" << endl;

        return ERROR;

    }

    else

    {

        while (p->next != NULL)               //循环每一个节点

        {

            if (p->data == data) {

                return p;                     //返回指针域

            }

            p = p->next;

        }

        return NULL;                           //未查询到结果

    }

}

 

//在尾部插入指定的元素

void LinkList::InsertElemAtEnd(DataType data)

{

    ElemType * newNode = new ElemType;    //定义一个Node结点指针newNode

    newNode->next = NULL;         //定义newNode的数据域和指针域

    newNode->data = data;

    ElemType * p = head;              //定义指针p指向头结点

    if (head == NULL) {           //当头结点为空时,设置newNode为头结点

        head = newNode;

    }

    else                          //循环知道最后一个节点,将newNode放置在最后

    {

        while (p->next != NULL)

        {

            p = p->next;

        }

        p->next = newNode;

    }

}

 

//在指定位置插入指定元素

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

{

    if (n<1 || n>GetLength())                   //输入有误报异常

        cout << "输入的值错误" << endl;

    else

    {

        ElemType * ptemp = new ElemType;        //创建一个新的节点

        ptemp->data = data;                     //定义数据域

        ElemType * p = head;                    //创建一个指针指向头结点

        int i = 1;

        while (n > i)                           //遍历到指定的位置

        {

            p = p->next;

            i++;

        }

        ptemp->next = p->next;                 //将新节点插入到指定位置

        p->next = ptemp;

    }

}

 

//在头部插入指定元素

void LinkList::InsertElemAtHead(DataType data)

{

    ElemType * newNode = new ElemType;    //定义一个Node结点指针newNode

    newNode->data = data;

    ElemType * p = head;              //定义指针p指向头结点

    if (head == NULL) {           //当头结点为空时,设置newNode为头结点

        head = newNode;

    }

    newNode->next = p->next;          //将新节点插入到指定位置

    p->next = newNode;

}

 

//在尾部删除元素

void LinkList::DeleteElemAtEnd()

{

    ElemType * p = head;          //创建一个指针指向头结点

    ElemType * ptemp = NULL;      //创建一个占位节点

    if (p->next == NULL) {        //判断链表是否为空

        cout << "单链表空" << endl;

    }

    else

    {

        while (p->next != NULL)   //循环到尾部的前一个

        {

            ptemp = p;            //将ptemp指向尾部的前一个节点

            p = p->next;          //p指向最后一个节点

        }

        delete p;                //删除尾部节点

        p = NULL;

        ptemp->next = NULL;

    }

}

 

//删除所有数据

void LinkList::DeleteAll()

{

    ElemType * p = head->next;

    ElemType * ptemp = new ElemType;

    while (p != NULL)                    //在头结点的下一个节点逐个删除节点

    {

        ptemp = p;

        p = p->next;

        head->next = p;

        ptemp->next = NULL;

        delete ptemp;

    }

    head->next = NULL;                 //头结点的下一个节点指向NULL

}

 

//删除指定的数据

void LinkList::DeleteElemAtPoint(DataType data)

{

    ElemType * ptemp = Find(data);    //查找到指定数据的节点位置

    if (ptemp == head->next) {        //判断是不是头结点的下一个节点,如果是就从头部删了它

        DeleteElemAtHead();

    }

    else

    {

        ElemType * p = head;          //p指向头结点

        while (p->next != ptemp)      //p循环到指定位置的前一个节点

        {

            p = p->next;

        }

        p->next = ptemp->next;         //删除指定位置的节点

        delete ptemp;

        ptemp = NULL;               

    }

 

}

 

//在头部删除节点

void LinkList::DeleteElemAtHead()

{

    ElemType * p = head;

    if (p == NULL || p->next == NULL) {   //判断是否为空表,报异常

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

    }

    else

    {

        ElemType * ptemp = NULL;      //创建一个占位节点

        p = p->next;

        ptemp = p->next;              //将头结点的下下个节点指向占位节点

        delete p;                     //删除头结点的下一个节点

        p = NULL;

        head->next = ptemp;           //头结点的指针更换

    }

}

 

//测试函数

int main()

{

    LinkList l;

    int i;

    cout << "1.创建单链表   2.遍历单链表   3.获取单链表的长度   4.判断单链表是否为空   5.获取节点\n";

    cout << "6.在尾部插入指定元素   7.在指定位置插入指定元素   8.在头部插入指定元素\n";

    cout<<"9.在尾部删除元素   10.删除所有元素   11.删除指定元素   12.在头部删除元素   0.退出" << endl;

    do

    {

        cout << "请输入要执行的操作: ";

        cin >> i;

        switch (i)

        {

        case 1:

            int n;

            cout << "请输入单链表的长度: ";

            cin >> n;

            l.CreateLinkList(n);

            break;

        case 2:

            l.TravalLinkList();

            break;

        case 3:

            cout << "该单链表的长度为" << l.GetLength() << endl;

            break;

        case 4:

            if (l.IsEmpty() == 1)

                cout << "该单链表是空表" << endl;

            else

            {

                cout << "该单链表不是空表" << endl;

            }

            break;

        case 5:

            DataType data;

            cout << "请输入要获取节点的值: ";

            cin >> data;

            cout << "该节点的值为" << l.Find(data)->data << endl;

            break;

        case 6:

            DataType endData;

            cout << "请输入要在尾部插入的值: ";

            cin >> endData;

            l.InsertElemAtEnd(endData);

            break;

        case 7:

            DataType pointData;

            int index;

            cout << "请输入要插入的数据: ";

            cin >> pointData;

            cout << "请输入要插入数据的位置: ";

            cin >> index;

            l.InsertElemAtIndex(pointData, index);

            break;

        case 8:

            DataType headData;

            cout << "请输入要在头部插入的值: ";

            cin >> headData;

            l.InsertElemAtHead(headData);

            break;

        case 9:

            l.DeleteElemAtEnd();

            break;

        case 10:

            l.DeleteAll();

            break;

        case 11:

            DataType pointDeleteData;

            cout << "请输入要删除的数据: ";

            cin >> pointDeleteData;

            l.DeleteElemAtPoint(pointDeleteData);

            break;

        case 12:

            l.DeleteElemAtHead();

            break;

        default:

            break;

        }

    }while (i != 0);

 

    system("pause");

    return 0;

}

 

以上,关于C++的全部内容讲解完毕啦,欢迎大家继续关注!更多关于C++的干货请关注职坐标C++频道!

本文由 @安安 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 0
看完这篇文章有何感觉?已经有2人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程