这是关于链表的相关操作:
#include<iostream>
using namespace std;
/*
* insertHead(T data)
* insertTail(T data)
* addIndex(T data)
* deleteIndex(int index)
* setIndex(int index,T data)
* get(int index)
* printList()
*/
//采用虚拟头结点的方法
template<class T>
class myList {
public:
struct ListNode {
T data;
ListNode* next;
//无参构造
ListNode():next(NULL) {}
//有参构造
ListNode(T d) :data(d), next(NULL) {}
};
myList() {
//进行初始化
head = new ListNode();
size = 0;
}
//头插法添加元素
bool insertHead(T data) {
ListNode* p = new ListNode(data);
p->next = head->next;
head->next = p;
size++;
return true;
}
//尾插法添加元素
bool insertTail(T data) {
ListNode* temp = head;
ListNode* p = new ListNode(data);
while (temp->next != nullptr) {
temp = temp->next;
}
p->next = temp->next;
temp->next = p;
size++;
return true;
}
//在指定索引位置添加元素
bool addIndex(int index,T data) {
if (index<0 || index>size - 1) {
cout << "链表的长度为"<<size<<",索引错误!请重新输入" << endl;
return false;
}
ListNode* p = new ListNode(data);
ListNode* temp = head;
int i = 0;
while (true) {
if (i == index) {
break;
}
else {
temp = temp->next;
i++;
}
}
p->next = temp->next;
temp->next = p;
size++;
return true;
}
//删除指定索引位置上的元素
bool deleteIndex(int index) {
if (index<0 || index>=size) {
cout << "链表的长度为" << size << ",索引错误!请重新输入" << endl;
return false;
}
int i = 0;
ListNode* temp = head;
while (true) {
if (i == index) {
break;
}
else {
temp = temp->next;
i++;
}
}
//p指向要删除的元素
ListNode* p = temp->next;
temp->next = p->next;
delete p;
size--;
return true;
}
//设置指定索引位置上的元素
bool setIndex(int index, T data) {
if (index<0 || index>size - 1) {
cout << "链表的长度为" << size << ",索引错误!请重新输入" << endl;
return false;
}
int i = 0;
ListNode* temp = head->next;
while (true) {
if (i == index) {
break;
}
else {
temp = temp->next;
i++;
}
}
temp->data = data;
return true;
}
//.查询指定索引位置上的元素
T get(int index) {
if (index<0 || index>size - 1) {
cout << "链表的长度为" << size << ",索引错误!请重新输入" << endl;
//退出程序
exit(1);
}
int i = 0;
ListNode* temp = head->next;
while (true) {
if (i == index) {
break;
}
else {
temp = temp->next;
i++;
}
}
return temp->data;
}
//遍历链表
void printList() {
if (size == 0) {
cout << "列表为空!" << endl;
}
ListNode* temp = head->next;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
//返回链表的长度
int length() {
return size;
}
private:
//头节点
ListNode* head;
//结点的个数
int size;
};
int main() {
myList<int> List = myList<int>();
int choice = 1;
int index;
int data;
bool flag=true;
while (true) {
cout << "*****************************************" << endl;
cout << "1.头插法添加元素" << endl;
cout << "2.尾插法添加元素" << endl;
cout << "3.在指定索引位置添加元素" << endl;
cout << "4.删除指定索引位置上的元素" << endl;
cout << "5.设置指定索引位置上的元素" << endl;
cout << "6.查询指定索引位置上的元素" << endl;
cout << "7.遍历链表" << endl;
cout << "0.退出" << endl;
cout << "*****************************************" << endl;
cout << "请输入你的选择:" << endl;
cin >> choice;
switch (choice)
{
case 1:
{
cout << "请输入你要插入的元素:" << endl;
cin >> data;
flag = List.insertHead(data);
if (flag) {
cout << "插入成功" << endl;
}
else {
cout << "插入失败!" << endl;
}
break;
}
case 2:
{
cout << "请输入你要插入的元素:" << endl;
cin >> data;
flag = List.insertTail(data);
if (flag) {
cout << "插入成功" << endl;
}
else {
cout << "插入失败!" << endl;
}
break;
}
case 3:
{
cout << "请依次输入你要插入的索引位置和元素:" << endl;
cin >> index >> data;
bool flag = List.addIndex(index, data);
if (flag) {
cout << "插入成功" << endl;
}
else {
cout << "插入失败!" << endl;
}
break;
}
case 4:
{
cout << "请输入你要删除的索引位置:" << endl;
cin >> index;
flag = List.deleteIndex(index);
if (flag) {
cout << "删除成功" << endl;
}
else {
cout << "删除失败!" << endl;
}
break;
}
case 5:
{
cout << "请依次输入你要设置的索引位置和元素:" << endl;
cin >> index >> data;
flag = List.setIndex(index, data);
if (flag) {
cout << "设置成功" << endl;
}
else {
cout << "设置失败!" << endl;
}
break;
}
case 6:
{
cout << "请输入索引位置:" << endl;
cin >> index;
data = List.get(index);
cout << data << endl;
break;
}
case 7:
{
List.printList();
break;
}
case 0:exit(1);
default:
break;
}
}
return 0;
}