单向链表的操作(C++实现)
#include <iostream>
using namespace std;
class Node
{
public:
int value;
Node *next;
};
class Linklist
{
public:
Linklist();
~Linklist();
void insert_tail(int value);
void insert_head(int value);
int insert_index(int index, int value);
int delete_index(int index);
int delete_value(int value);
int update_index(int index, int value);
int update_value(int value, int new_value);
int len();
void print();
void DeleteAll();
private:
Node *head;
};
Linklist::Linklist()
{
head = new Node;
head->value = 0;
head->next = NULL;
}
Linklist::~Linklist()
{
delete head;
}
void Linklist::print()
{
if (head == NULL)
{
cout << "链表为空" << endl;
}
Node *p = head;
while (p->next != NULL)
{
p = p->next;
cout << p->value << " ";
}
cout << "\n";
}
void Linklist::insert_tail(int value)
{
Node *p = head;
Node *newnode = new Node;
newnode->value = value;
newnode->next = NULL;
if (p == NULL)
{
p = newnode;
}
else
{
while (p->next != NULL)
{
p = p->next;
}
p->next = newnode;
}
}
void Linklist::insert_head(int value)
{
Node *newnode = new Node;
newnode->value = value;
Node *p = head;
if (NULL == p)
{
p = newnode;
}
newnode->next = p->next;
p->next = newnode;
}
int Linklist::insert_index(int index, int x)
{
if (index < 0 || index > Linklist::len())
{
cout << "该位超出链表长度!" << endl;
return -1;
}
int i = 0;
Node *newnode = new Node;
Node *p = head;
for (i = 1; i < index; i++)
{
p = p->next;
}
newnode->value = x;
newnode->next = p->next;
p->next = newnode;
}
int Linklist::update_index(int index, int value)
{
Node *p = head;
if (index < 0 || index > Linklist::len())
{
cout << "该位超出链表长度!" << endl;
return -1;
}
int i = 0;
for (i = 0; i < index; i++)
{
p = p->next;
}
p->value = value;
}
int Linklist::delete_index(int index)
{
Node *p = head;
if (index < 0 || index > Linklist::len())
{
cout << "该位超出链表长度!" << endl;
return -1;
}
int i = 0;
for (i = 1; i < index; i++)
{
p = p->next;
}
Node *ptr = p->next;
p->next = ptr->next;
free(ptr);
}
int Linklist::update_value(int n, int x)
{
Node *p = head;
int count = 0;
while (p != NULL)
{
if (p->value == n)
{
p->value = x;
count++;
}
p = p->next;
}
if (count == 0)
{
cout << "未发现该值!" << endl;
return -1;
}
}
int Linklist::delete_value(int value)
{
Node *p = head;
int count = 0;
while (p->next != NULL)
{
if (p->next->value == value)
{
Node *ptr = p->next;
p->next = ptr->next;
free(ptr);
count++;
}
else
{
p = p->next;
}
}
if (count == 0)
{
cout << "未发现该值!" << endl;
return -1;
}
}
int Linklist::len()
{
int count = 0;
Node *p = head->next;
while (p != NULL)
{
count++;
p = p->next;
}
return count;
}
void Linklist::DeleteAll()
{
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 face()
{
system("clear");
cout << "+---------------------------------------------------------------------+" << endl;
cout << "| 1.查看链表内容 2.查看链表长度 3.清空链表全部内容 |" << endl;
cout << "| 4.尾插 5.头插 6.按位插入 |" << endl;
cout << "| 7.按位删除 8.按值删除 9.按位替换 |" << endl;
cout << "| 10.按值替换 11.退出 |" << endl;
cout << "+---------------------------------------------------------------------+" << endl;
}
int main()
{
Linklist l;
int i = 1;
int index = 0;
int value = 0;
int new_value = 0;
face();
while (i != 0)
{
cout << "请输入操作选项:";
cin >> i;
switch (i)
{
case 1:
face();
cout << "链表内容:" << endl;
l.print();
break;
case 2:
face();
cout << "链表长度:" << l.len() << endl;
break;
case 3:
l.DeleteAll();
face();
cout << "清除成功" << endl;
break;
case 4:
cout << "请输入插入值:";
cin >> value;
l.insert_tail(value);
face();
cout << "尾插成功" << endl;
break;
case 5:
cout << "请输入插入值:";
cin >> value;
l.insert_head(value);
face();
cout << "头插成功" << endl;
break;
case 6:
cout << "请依次输入插入位和插入值:";
cin >> index >> value;
l.insert_index(index, value);
face();
cout << "按位插入成功" << endl;
break;
case 7:
cout << "请输入删除位:";
cin >> index;
l.delete_index(index);
face();
cout << "按位删除成功" << endl;
break;
case 8:
cout << "请输入删除值:";
cin >> value;
l.delete_value(value);
face();
cout << "按值删除成功" << endl;
break;
case 9:
cout << "请依次输入替换位和替换值:";
cin >> index >> value;
l.update_index(index, value);
face();
cout << "按位替换成功" << endl;
break;
case 10:
cout << "请依次输入被替换值和新值:";
cin >> value >> new_value;
l.update_value(value, new_value);
face();
cout << "按值替换成功" << endl;
break;
case 11:
l.DeleteAll();
l.~Linklist();
exit(-1);
break;
default:
break;
}
}
return 0;
}