C++实现单链表的12种基本操作

来源:互联网 发布:解锁姿势体验知乎 编辑:程序博客网 时间:2024/05/16 16:36


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;               //将头结点的数据域定义为0head->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;          //新节点的下一个地址为NULLptemp->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结点指针newNodenewNode->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结点指针newNodenewNode->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;}

阅读全文
'); })();
1 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 搜贷网 手机搜不到蓝牙耳机 阿凡题搜题 51搜了网 网上拍照搜题 搜附近酒店 搜店铺 搜航网 搜淘网 搜鞋子 淘宝搜店铺 拍题搜题 搜道免费试用 搜食记 搜财网 搜扣扣 猿搜题app 搜电视 搜服123 搜铺位 搜酒店 iphone搜不到wifi 外贸搜软件 我要上搜服 搜附近的酒店 找搜服网 搜周边宾馆 上搜服 51搜款网 搜过输入法 59搜款网 88搜服 91搜课网 怎么搜网站 大搜车怎么样 拉搜网 怎样搜图片 热搜图片 要搜服 种子在线搜 999搜服网