#pragma once
#ifndef LIST
#define LIST
#include<iostream>
#include<string>
using namespace std;
class node {
public:
int data;
node* left;
node *next;
};
class LinkList {
public:
LinkList();
~LinkList();
void createCirclelist(int num);
void createDoubledirection(int num);
void insertDoubledirection(int data);
void deleteDoubledirection(int data);
void is_Empty();
void invert();
void insertHead(int data);
void createInsert(int data);
void insertTail(int data);
void insertSpecial(int data);
node* findByIndex(int data);
void listLength(int data);
void deleteByIndex(int data);
void deleteByTail();
void deleteAll();
void deleteByHead();
void editByIndex(int data);
void print();
private:
node* head;
};
LinkList::LinkList() {
head = new node();
head->data = 0;
head->next = NULL;
head->left = NULL;
}
LinkList::~LinkList() {
delete head;
}
#endif
#include"list.h"
#include<iostream>
void linklist::inserthead(int data) {
node* newnode = new node();
newnode->data = data;
newnode->next = null;
newnode->next = head->next;
head->next = newnode;
}
void linklist::createinsert(int data) {
node* temp = head;
int num = 0;
cout << "请输入链表元素" << endl;
for (int i = 0; i < data; i++) {
node* n = new node();
cin >> n->data;
n->next = null;
temp->next = n;
temp = n;
num++;
}
cout << "链表的长度: ";
cout << num << endl;
}
void linklist::listlength(int data) {
node* temp = head;
int num = 0;
for (int i = 0; i < data; i++) {
num++;
}
cout << "链表的长度: ";
cout << num << endl;
}
node* linklist::findbyindex(int data) {
node *p = head->next;
int num = 0;
for (p; p != null; p = p->next) {
if (p->data != data)
{
num++;
continue;
}
else return p;
}
}
void linklist::print() {
node *p = head;
cout << "生成的链表为" << endl;
if (p!= null) {
for (p = p->next; p != null; p = p->next) {
cout << p->data;
if (p->next)
cout << "->";
}
cout << endl;
}
else {
cout << "链表为空" << endl;
}
}
void linklist::is_empty() {
if (head->next == null)
cout << "链表为空" << endl;
else
cout << "链表不为空" << endl;
}
void linklist::invert() {
node* first = head->next , *final = 0, *temp;
while (first) {
temp = final;
final = first;
first = first->next;
final->next = temp;
}
head->next = final;
node *p = head->next;
cout << "生成的链表为" << endl;
for (p; p != null; p = p->next) {
cout << p->data;
if (p->next)
cout << "->";
}
cout << endl;
}
void linklist::inserttail(int data) {
if (head->next == null) {
node* pnew = new node();
pnew->data = data;
pnew->next = null;
head->next = pnew;
}
else {
node* temp = head->next;
node* pnew = new node();
pnew->data = data;
pnew->next = null;
while (temp != pnew) {
if (temp->next != null)
{
temp = temp->next;
continue;
}
else
{
temp->next = pnew;
temp = temp->next;
}
}
}
}
void linklist::insertspecial(int data) {
node* temp = head;
node* pnew = new node();
int num;
cout << "请输入要插入的数据" << endl;
cin >> num;
pnew->data = num;
pnew->next = null;
while (temp->data != data) {
temp = temp->next;
continue;
}
if (temp->data == data) {
if (temp->next == null)
temp->next = pnew;
else {
pnew->next = temp->next;
temp->next = pnew;
}
}
}
void linklist::deletebyindex(int data) {
node* temp = head;
node* pnew = findbyindex(data);
while (temp->next!= pnew) {
temp = temp->next;
continue;
}
if (temp->next == pnew) {
temp->next = pnew->next;
delete pnew;
pnew = null;
}
}
void linklist::deletebytail() {
node* temp = head;
if (head->next == null) {
cout << "链表为空,不能再删了" << endl;
}
else {
while (temp->next->next != null)
{
temp = temp->next;
}
delete temp->next->next;
temp->next = null;
}
}
void linklist::deleteall() {
node* temp = head;
node* p = new node();
while (head!= null) {
p = head->next;
free(head);
head = p;
}
}
void linklist::deletebyhead() {
head->next = head->next->next;
delete head->next;
}
void linklist::editbyindex(int data) {
node* point = findbyindex(data);
int num;
cout << "请输入修改后的数据: ";
cin >> num;
point->data = num;
}
void linklist::createcirclelist(int num) {
cout << "请输入链表元素的值" << endl;
int data;
node* temp = head;
for (int i = 0; i < num; i++) {
node* pnew = new node();
cin >> data;
pnew->data = data;
pnew->next = null;
temp->next = pnew;
temp = temp->next;
pnew->next = head->next;
}
}
void linklist::createdoubledirection(int num) {
cout << "请输入链表元素的值" << endl;
int data;
node* temp = head;
for (int i = 0; i < num; i++) {
node* pnew = new node();
cin >> data;
pnew->data = data;
temp->next= pnew;
pnew->next = null;
pnew->left = temp;
temp = temp->next;
}
}
void linklist::insertdoubledirection(int data) {
node* point = findbyindex(data);
node* pnew = new node();
node* temp = head;
int num;
cout << "请输入要插入的数" << endl;
cin >> num;
pnew->data = num;
pnew->left = null;
pnew->next = null;
while (temp->next) {
if (temp->next != point) {
temp = temp->next;
}
else break;
}
if (temp->next == point) {
temp->next = pnew;
pnew->next = point;
point->left = pnew;
pnew->left = temp;
}
}
void linklist::deletedoubledirection(int data) {
node* point = findbyindex(data);
point->left->next = point->next;
point->next->left = point->left;
delete point;
}
int main() {
int a;
linklist list;
while (1) {
cout << "******************************************************************************" << endl;
cout << "1.创建单链表 2.遍历单链表 3.获取单链表长度 4.判断单链表是否为空 5.反转" << endl;
cout << "6.获取节点 7.在尾部插入指定元素 8.在指定位置插入指定元素 9.在头部插入指定元素" << endl;
cout << "10.在尾部删除指定元素 11.删除所有元素 12.删除指定元素 13.删除头部元素 14.查找元素 0.退出" << endl;
cout << "15.修改元素 16.创建循环链表 17.创建双向链表 18.向双向链表插入数据 19.根据索引删除双向链表" << endl;
cout << "************************************************************************************" << endl;
cin >> a;
switch (a) {
case 1:
int num;
cout << "请输入要创建链表的元素个数: ";
cin >> num;
list.createinsert(num); continue;
case 2:
list.print(); continue;
case 3:
list.listlength(num); continue;
case 4:
list.is_empty(); continue;
case 5:
list.invert(); continue;
case 6:
continue;
case 7:
cout << "请输入要添加的数:";
cin >> num;
list.inserttail(num); continue;
case 8:
cout << "请输入要指定插入的位置: " ;
cin >> num;
list.insertspecial(num); continue;
case 9:
cout << "请输入要插入的数据: ";
cin >> num;
list.inserthead(num);
continue;
case 10:
list.deletebytail();
continue;
case 11:list.deleteall();
continue;
case 12:
cout << "请输入要删除的数:";
cin >> num;
list.deletebyindex(num); continue;
case 13:
list.deletebyhead(); list.print(); continue;
case 14:
cout << "查找的数字为:";
cin >> num;
cout << "查找的数字为:" << list.findbyindex(num)->data << endl;
continue;
case 15:
int data;
cout << "请输入要修改的节点的数值"<<endl;
cin >> data;
list.editbyindex(data);
continue;
case 16:
cout << "请输入循环链表的元素个数" << endl;
cin >> num;
list.createcirclelist(num);
continue;
case 17:
cout << "请输入双向链表链表的元素个数" << endl;
cin >> num;
list.createdoubledirection(num);
continue;
case 18:
cout << "请输入插入双向链表的元素位置(按元素数值来看)" << endl;
cin >> num;
list.insertdoubledirection(num);
continue;
case 19:
cout << "请输入要删除的数:";
cin >> num;
list.deletedoubledirection(num);
continue;
case 0:
return 0;
}
}
}