单链表的各项操作
实现功能:
- 初始化
- 创建单链表(头插法、尾插法)⭐
- 插入元素⭐
- 删除元素⭐
- 读取元素
- 查找元素(按值查找)
- 排序链表(升序)⭐
- 清空链表(保留头结点)
- 销毁链表(不保留头结点)
- 遍历链表
- 退出操作
PS:带星号的为难点
#include <iostream>
using namespace std;
struct Node
{
int data;
struct Node* next;
};
typedef struct Node LNode;
typedef struct Node* LinkList;
void Init(LinkList& L)
{
L = new LNode;
L->next = NULL;
}
void creatLinkList_H(LinkList& L, int n)
{
L = new LNode;
L->next = NULL;
LNode* p;
cout << "请输入" << n << "个数据:" << endl;
for (int i = 0; i < n; i++)
{
p = new LNode;
p->next = NULL;
cin >> p->data;
p->next = L->next;
L->next = p;
}
system("pause");
system("cls");
}
void creatLinkList_F(LinkList& L, int n)
{
L = new LNode;
L->next = NULL;
LNode* p;
LNode* r;
r = L;
cout << "请输入" << n << "个数据:" << endl;
for (int i = 0; i < n; i++)
{
p = new LNode;
p->next = NULL;
cin >> p->data;
r->next = p;
p->next = NULL;
r = p;
}
system("pause");
system("cls");
}
void creatFunction(LinkList& L)
{
int n;
cout << "请输入你要创建的链表长度:" << endl;
cin >> n;
int choice;
cout << "请选择建立链表的方式:0-头插法 1-尾插法" << endl;
cin >> choice;
if (choice == 0)
{
creatLinkList_H(L, n);
}
else
{
creatLinkList_F(L, n);
}
}
int insertElem(LinkList& L, int i, int e)
{
int k;
LNode* p;
LNode* s;
p = L;
k = 1;
while (p != NULL && k < i)
{
p = p->next;
k++;
}
if (p == NULL || k > i)
{
cout << "插入失败!位置不存在!" << endl;
return 0;
}
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
cout << "插入成功!" << endl;
system("pause");
system("cls");
return 1;
}
void insertFunction(LinkList& L)
{
int n;
cout << "请输入插入位置:" << endl;
cin >> n;
int ElemData;
cout << "请输入元素值:" << endl;
cin >> ElemData;
insertElem(L, n, ElemData);
}
int deleteElem(LinkList& L, int i, int* e)
{
int k = 1;
LNode* p;
LNode* q;
p = L;
while (p->next != NULL && k < i)
{
p = p->next;
k++;
}
if (p->next == NULL || k > i)
{
cout << "删除失败!删除位置不合法!" << endl;
system("pause");
system("cls");
return 0;
}
q = p->next;
p->next = q->next;
*e = q->data;
cout << "删除成功!第" << i << "号元素已被删除,它的值为:" << *e << endl;
delete q;
system("pause");
system("cls");
return 1;
}
void deleteFunction(LinkList& L)
{
int i;
cout << "请输入你要删除的位置:" << endl;
cin >> i;
int recovery;
deleteElem(L, i, &recovery);
}
int GetElem(LinkList L, int i, int e)
{
int j;
LNode* p;
p = L->next;
j = 1;
while (p != NULL && j < i)
{
p = p->next;
j++;
}
if (p == NULL || j > i)
{
cout << "查找失败!没有该元素!" << endl;
system("pause");
system("cls");
return 0;
}
e = p->data;
cout << "查找成功!第" << i << "号位置的元素值为:" << e << endl;
system("pause");
system("cls");
return 1;
}
void getFunction(LinkList L)
{
int find;
cout << "请输入你要查找的位置:" << endl;
cin >> find;
GetElem(L, find, 0);
}
LNode* LocateElem(LinkList L, int e)
{
LNode* p;
p = L->next;
while (p != NULL && p->data != e)
{
p = p->next;
}
return p;
}
void locateFunction(LinkList L)
{
int locateElem;
cout << "请输入你要查找的元素值:" << endl;
cin >> locateElem;
cout << LocateElem(L, locateElem);
system("pause");
system("cls");
}
void clearLinkList(LinkList& L)
{
LNode* p;
LNode* q;
p = L->next;
while(p != NULL)
{
q = p->next;
delete p;
p = q;
}
L->next = NULL;
cout << "销毁链表操作完成!" << endl;
system("pause");
system("cls");
}
void insertSortLinkList(LinkList& L)
{
LNode* pre, * p, * q;
p = L->next->next;
L->next->next = NULL;
while (p != NULL)
{
q = p->next;
pre = L;
while (pre->next != NULL && pre->next->data < p->data)
{
pre = pre->next;
}
p->next = pre->next;
pre->next = p;
p = q;
}
system("pause");
system("cls");
}
void destoryLinkList(LinkList& L)
{
LNode* pre;
LNode* p;
pre = L;
p = L->next;
while (p != NULL)
{
delete pre;
pre = p;
p = p->next;
}
delete pre;
system("pause");
system("cls");
}
void printLinkList(LinkList L)
{
LNode* p;
p = L->next;
cout << "遍历结果:" << endl;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
system("pause");
system("cls");
}
void showMenu()
{
cout << "--------------------------" << endl;
cout << "--------1.创建链表--------" << endl;
cout << "--------2.插入元素--------" << endl;
cout << "--------3.删除元素--------" << endl;
cout << "--------4.按值查找--------" << endl;
cout << "--------5.读取元素--------" << endl;
cout << "--------6.遍历链表--------" << endl;
cout << "--------7.整表清空--------" << endl;
cout << "--------8.排序链表--------" << endl;
cout << "--------9.销毁链表--------" << endl;
cout << "--------0.退出操作--------" << endl;
cout << "--------------------------" << endl;
}
int main()
{
LinkList L;
Init(L);
int selection;
while (true)
{
showMenu();
cin >> selection;
switch (selection)
{
case 1:
creatFunction(L);
break;
case 2:
insertFunction(L);
break;
case 3:
deleteFunction(L);
break;
case 4:
locateFunction(L);
break;
case 5:
getFunction(L);
break;
case 6:
printLinkList(L);
break;
case 7:
clearLinkList(L);
break;
case 8:
insertSortLinkList(L);
break;
case 9:
destoryLinkList(L);
break;
case 0:
cout << "欢迎下次使用!" << endl;
system("pause");
return 0;
break;
default:
break;
}
}
}