#include<iostream>
using namespace std;
typedef int DataType;
class Node {
public:
int data;
Node * next;
};
class LinkList {
public:
LinkList();
~LinkList();
//创建一个单链表
void createLinkList(int n);
//遍历线性链表
void travalLinkList();
//获取链表长度
int getLinkListLength();
//判断单链表是否为空
bool isEmpty();
//寻找链表节点
Node *findNode(DataType data);
//尾部插入指定值
void insertLinkListAtEnd(DataType data);
//在指定位置插入值
void insertLinkListAtIndex(DataType data, int index);
//在头部插入数值
void insertLinkListAtHead(DataType data);
//删除尾部数据库
void deleteLinkListAtEnd();
//删除所有数据
void deleteLinkListAll();
//删除指定数据
void deleteLinkListAtPoint(DataType data);
//在指定位置删除数据
void deleteLinkListAtIndex(int index);
//删除头部位置的数据
void deleteLinkListAtHead();
//翻转链表所有的数据
void reverseLinkList();
private:
Node * head;
};
LinkList::LinkList() {
head = new Node;
head->data = 0;
head->next = NULL;
}
LinkList::~LinkList() {
delete head;
}
void LinkList::createLinkList(int n) {
Node *pnew, *ptemp;
ptemp = head;
if (n < 0) {
cout << "输入的节点个数有误" << endl;
exit(EXIT_FAILURE);
}
for (int i = 0; i < n; i++) {
pnew = new Node;
cout << "请输入第" << i + 1 << "个值: ";
cin >> pnew->data;
pnew->next = NULL;
ptemp->next = pnew;
ptemp = pnew;
}
}
void LinkList::travalLinkList() {
if (head == NULL || head->next == NULL) {
cout << "链表为空表" << endl;
}
Node *ptemp = head;
while (ptemp->next != NULL) {
ptemp = ptemp->next;
cout << ptemp->data << " ";
}
cout << endl;
}
//获取链表的长度
int LinkList::getLinkListLength() {
int count = 0;
Node *ptemp = head;
while (ptemp->next != NULL) {
ptemp = ptemp->next;
count++;
}
return count;
}
//判断链表是否为空
bool LinkList::isEmpty() {
if (head->next == NULL) {
return true;
}
return false;
}
Node* LinkList::findNode(DataType data) {
Node *ptemp = head;
if (ptemp == NULL) {
cout << "此链表为空链表" << endl;
return NULL;
}
while (ptemp->next != NULL)
{
if (ptemp->data == data) {
return ptemp;
}
ptemp = ptemp->next;
}
return NULL;
}
//在链表尾部插入数据
void LinkList::insertLinkListAtEnd(DataType data) {
Node *newNode = new Node;
newNode->data = data;
newNode->next = NULL;
Node *ptemp = head;
if (head == NULL) {
head = newNode;
}
else {
while (ptemp->next != NULL)
{
ptemp = ptemp->next;
}
ptemp->next = newNode;
}
}
//在链表指定位置插入数据
void LinkList::insertLinkListAtIndex(DataType data, int index) {
if (index < 1 || index> getLinkListLength()){
cout << "输入的值错误" << endl;
}
Node * newNode = new Node;
newNode->data = data;
newNode->next = NULL;
Node *ptemp = head;
int i = 1;
while (i < index) {
ptemp = ptemp->next;
i++;
}
newNode->next = ptemp->next;
ptemp->next = newNode;
}
//在链表头部后面插入数据
void LinkList::insertLinkListAtHead(DataType data) {
Node *newNode = new Node;
newNode->data = data;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
}
Node *ptemp = head;
newNode->next = ptemp->next;
ptemp->next = newNode;
}
//在尾部删除数据
void LinkList::deleteLinkListAtEnd() {
Node *p = head;
Node *ptemp = NULL;
if (p == NULL || p->next == NULL) {
cout << "单链表空" << endl;
}
else {
while (p->next != NULL) {
ptemp = p;
p = p->next;
}
delete p;
p = NULL;
ptemp->next = NULL;
}
}
//删除所有的数据
void LinkList::deleteLinkListAll(){
Node * p = head->next;
Node *ptemp = new Node;
while (p != NULL){
ptemp = p;
p = p->next;
head->next = p;
ptemp->next = NULL;
delete ptemp;
}
head->next = NULL;
}
//删除指定数据
void LinkList::deleteLinkListAtPoint(DataType data){
Node *ptemp = findNode(data);
if (ptemp == head->next){
deleteLinkListAll();
}
else{
Node *p = head;
while (p->next != ptemp)
{
p = p->next;
}
p->next = ptemp->next;
delete ptemp;
ptemp = NULL;
}
}
//在头部删除数据
void LinkList::deleteLinkListAtHead(){
Node *p = head;
if (p == NULL || p->next == NULL){
cout << "该链表为空表" << endl;
}
else{
Node *ptemp = NULL;
p = p->next;
ptemp = p->next;
delete p;
p = NULL;
head->next = ptemp;
}
}
//在指定位置删除数据
void LinkList::deleteLinkListAtIndex(int index){
if (index <1 || index > getLinkListLength()){
cout << "输入的删除位置错误" << endl;
}
Node *p = head;
if (p ==NULL || p->next == NULL){
cout << "链表为空" << endl;
}
int i = 0;
Node *ptemp = NULL;
while (i < index) {
ptemp = p;
p = p->next;
i++;
}
ptemp->next = p->next;
delete p;
p = NULL;
}
/*
//翻转链表
Node* LinkList::reverseLinkList(){
Node *p = head;
if (p == NULL || p->next == NULL){
cout << "链表为空" << endl;
}
Node *reverseList = new Node;
reverseList->next = NULL;
reverseList->data = 0;
Node *ptemp = NULL;
while (p != NULL){
ptemp = p->next;
//reverseList前插入数据
p->next = reverseList->next;
reverseList->next = p;
p = ptemp;
}
return reverseList;
}
*/
int main(){
LinkList linklist = LinkList();
int i;
cout << "1.创建单链表 2.遍历单链表\n";
cout << "3.获取单链表的长度 4.判断单链表是否为空\n";
cout << "5.获取节点 6.在尾部插入指定元素\n";
cout << "7.在指定位置插入指定元素 8.在头部插入指定元素\n";
cout << "9.在尾部删除元素 10.删除所有元素\n";
cout << "11.删除指定元素 12.在头部删除元素\n";
cout << "13.删除指定位置的数据 0.退出" << endl;
do{
cout << "请输入要执行的操作: ";
cin >> i;
switch (i)
{
case 1:
int n;
cout << "请输入链表的长度" << endl;
cin >> n;
linklist.createLinkList(n);
break;
case 2:
linklist.travalLinkList();
break;
case 3:
cout << "链表的长度:" << linklist.getLinkListLength() << endl;
break;
case 4:
if (linklist.isEmpty()){
cout << "该单链表是空表" << endl;
}
else
{
cout << "该单链表不是空表" << endl;
}
break;
case 5:
int data;
cout << "请输入要获取节点的值: ";
cin >> data;
cout << "该节点的值为:" << linklist.findNode(data)->data << endl;
break;
case 6:
int endData;
cout << "请输入要在尾部插入的值: ";
cin >> endData;
linklist.insertLinkListAtEnd(endData);
break;
case 7:
DataType pointData;
int index;
cout << "请输出要插入的值" << endl;
cin >> pointData;
cout << "请输出要插入值的位置" << endl;
cin >> index;
linklist.insertLinkListAtIndex(pointData, index);
break;
case 8:
DataType headData;
cout << "请输出在头部要插入的值" << endl;
cin >> headData;
linklist.insertLinkListAtHead(headData);
break;
case 9:
linklist.deleteLinkListAtEnd();
cout << "尾部删除数据操作完成"<< endl;
break;
case 10:
linklist.deleteLinkListAll();
cout << "删除所有数据操作完成" << endl;
break;
case 11:
DataType pointDeleteData;
cout << "请输出要删除的指定值" << endl;
cin >> pointDeleteData;
linklist.deleteLinkListAtPoint(pointDeleteData);
break;
case 12:
linklist.deleteLinkListAtHead();
cout << "删除头部数据操作完成" << endl;
break;
case 13:
int deleteIndex;
cout << "请输出要删除值的位置" << endl;
cin >> deleteIndex;
linklist.deleteLinkListAtIndex(deleteIndex);
break;
default:
break;
}
} while (i != 0);
system("pause");
return 0;
}
C++单链表增删查找的基本操作
最新推荐文章于 2022-07-22 14:30:15 发布