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;}
阅读全文