#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct LinkNode
{
int data; //数据域 为了方便操作未使用模板
struct LinkNode* next;
}LinkNode,*LinkList;
//头插
void Init_LinkList_H(LinkList& L)
{
int n;
L = new LinkNode;
L->next = NULL;
cout << "请输入元素个数" << endl;
cin >> n;
cout << "请依次输入元素" << endl;
while (n--)
{
LinkNode* s = new LinkNode;
cin >> s->data;
s->next = NULL;
s->next = L->next;
L->next = s;
}
}
//尾插
void Init_LinkList_R(LinkList& L)
{
int n = 0;
cout << "请输入元素个数" << endl;
cin >> n;
L = new LinkNode;
L->next = NULL;
LinkList r = L;
cout << "请依次输入元素" << endl;
while (n--)
{
LinkList s = new LinkNode;
s->next = NULL;
cin >> s->data;
r->next = s;
r = s;
}
}
//查找 位置
bool find_by_pos(LinkList L, int i, int& e)
{
if (!L)
{
return false;
}
LinkList p = L->next;
int j = 1;
while (j < i && p != NULL)
{
p = p->next;
j++;
}
if (p == NULL || i < j)
{
cout << "输入有误" << endl;
return false;
}
e = p->data;
return true;
}
//查找 值
bool find_by_val(LinkList L)
{
if (!L)
{
return false;
cout << "链表未初始化" << endl;
}
int e = 0;
cout << "输入你要查找的元素" << endl;
cin >> e;
LinkList p = L->next;
while (p != NULL && p->data != e)
{
p = p->next;
}
if (p == NULL)
{
cout << "未找到" << endl;
return false;
}
cout << "找到了:" << e << endl;
return true;
}
//删除
bool remove_by_pos(LinkList& L)
{
if (!L)
{
cout << "链表未初始化" << endl;
}
int i = 0;
cout << "请输入删除第几个元素" << endl;
cin >> i;
LinkList p = nullptr;
p = L->next;
int j = 1;
//找到所需删除元素的前一个位置 进行删除操作
while (p != NULL && j < i - 1)
{
p = p->next;
}
if (p == NULL )
{
cout << "未找到所要删除元素" << endl;
return false;
}
else
{
LinkList d = p->next;
p->next = d->next;
delete d;
cout << "删除成功" << endl;
return true;
}
}
//插入 位置
bool insert_by_pos(LinkList& L)
{
int i = -1, e = -1;
cout << "请输入插入的位置" << endl;
cin >> i;
int j = 1;
LinkList p = L->next;
while (p != nullptr && j < i - 1) //尽量用nullptr替换NULL
{
p = p->next;
j++;
}
if (p == nullptr || j > i - 1)
{
cout << "位置错误" << endl;
return false;
}
else
{
LinkList s = new LinkNode;
cout << "请输入插入的元素" << endl;
cin >> e;
s->data = e;
s->next = nullptr;
s->next = p->next;
p->next = s;
cout << "插入成功" << endl;
return true;
}
}
//不占用新空间合并
void merge_LinkList(LinkList& La, LinkList& Lb, LinkList& Lc)
{
LinkList p, q, r; //r指针永远指向Lc末端
p = La->next;
q = Lb->next;
Lc = La;
r = Lc; //r在Lc末端
while (p != NULL && q != NULL)
{
if (p->data < q->data) //谁小进入Lc
{
r->next = p;
r = p;
p = p->next;
}
else //反之
{
r->next = q;
r = q;
q = q->next;
}
}
r->next = p ? q : q; //哪个链表长 用r指针接上后续的表
delete Lb;
}
//打印
void Print(LinkList L)
{
if (L == NULL)
{
cout << "错误" << endl;
return;
}
LinkList p;
p = L->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
//找到中间元素
void findmiddle(LinkList L)
{
LinkList p, q;
p = L; //快指针
q = L; //慢指针
while (p != NULL && p->next != NULL)
{
p = p->next->next;
q = q->next;
}
cout << "中间值:" << q->data << endl;
}
//初始化
bool InitList_L(LinkList& L)
{
L = new LinkNode;
if (!L)
{
return false;
}
L->next = NULL;
return true;
}
void ShowMenu()
{
cout << "1链表初始化(头插)" << endl;
cout << "2链表初始化(尾插)" << endl;
cout << "3打印链表" << endl;
cout << "4查找元素(By_pos)" << endl;
cout << "5查找元素(By_val)" << endl;
cout << "6删除元素(By_pos)" << endl;
cout << "7插入元素" << endl;
cout << "8合并链表" << endl;
cout << "9寻找链表中间元素" << endl;
cout << "-----------------" << endl;
}
int main()
{
LinkList La, Lb, Lc;
int i = 0, e = 0;
bool ret = false;
InitList_L(La);
int choice;
int index = 5;
while (true)
{
cout << "请输入你的选择" << endl;
if (index % 5 == 0) //每5次操作 打印一次表格
{
ShowMenu();
}
index++;
cin >> choice;
switch (choice)
{
case 1:
Init_LinkList_H(La);
break;
case 2:
Init_LinkList_R(La);
break;
case 3:
cout << "打印如下" << endl;
Print(La);
break;
case 4:
cout << "请输入所需查找元素位置" << endl;
cin >> i;
ret = find_by_pos(La, i, e);
if (ret)
{
cout << "找到元素:" << e << endl;
}
else {
cout << "未找到" << endl;
}
break;
case 5:
find_by_val(La);
break;
case 6:
remove_by_pos(La);
break;
case 7:
insert_by_pos(La);
break;
case 8:
cout << "表La 有序递增" << endl;
Init_LinkList_R(La);
cout << "表Lb 有序递增" << endl;
Init_LinkList_R(Lb);
merge_LinkList(La, Lb, Lc);
cout << "表Lc" << endl;
Print(Lc);
break;
case 9:
Init_LinkList_R(La);
findmiddle(La);
break;
default:
cout << "选择错误" << endl;
break;
}
}
system("pause");
return EXIT_SUCCESS;
}
单链表基本操作(头插初始化,尾插初始化,查找(by位置 ,by值),删除(by位置),插入(by位置),合并链表,查找中间元素)
最新推荐文章于 2022-06-19 11:11:36 发布