上课没听,现学现卖
😅
实验二:实现单链表各种基本运算的算法
内容:编写程序实现单链表各种基本运算,并编写main方法测试程序可行性。主要完成以下功能:
1、 初始化单链表;
2、 一次采用尾插法插入a、b、c、d、e元素;
3、 输出单链表;
4、 输出单链表长度;
5、 判断单链表是否为空;
6、 输出单链表的第3个元素;
7、 输出元素d的位置;
8、 在第4个元素位置上插入f元素;
9、 输出插入后的单链表;
10、 删除单链表中的第2个元素;
11、 输出删除后的单链表;
12、 (选做)单链表“原地”逆转,要求算法空间复杂度为O(1)。
PS:12不会,那位大神可以教教我吗???
#include<iostream>
using namespace std;
typedef struct LNode {
int date;
struct LNode* next;
}LNode, * LinkList;
//LinkList与LNode*二者本质上是等价的
LinkList r, p, s;
int n;
bool InitList(LinkList& L) {
L = new LNode;
L->next = NULL;
return 1;
}
void CreatList_R(LinkList& L, int n) {
L = new LNode;
L->next = NULL;
r = L;
for (int i = 0; i < n; i++) {
p = new LNode;
cin >> p->date;
p->next = NULL;
r->next = p;
r = p;
}
}
bool GetElem(LinkList L, int i, int& e) {
p = L->next; int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) return 0;
e = p->date;
return 1;
}
bool Judge(LinkList L) {
if (L->next == NULL) return 0;
return 1;
}
LNode* LocateElem(LinkList L, int e) {
p = L->next;
while (p && p->date != e) p = p->next;
return p;
}
bool ListInsert(LinkList& L, int i, int e) {
p = L; int j = 0;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p || j > i - 1) return 0;
s = new LNode;
s->date = e;
s->next = p->next;
p->next = s;
return 1;
}
bool ListDelete(LinkList& L, int i) {
p = L; int j = 0;
while (p->next && j < i - 1) {
p = p->next; j++;
}
if (!p->next || j > i - 1) return 0;
s = p->next;
p->next = s->next;
delete s;
return 1;
}
void print(LinkList L, int num) {
int tmp = 0;
for (int i = 1; i <= n; i++) {
GetElem(L, i, tmp);
cout << tmp << " ";
}
cout << endl << "----------------" << endl << endl;
}
int main() {
LNode* list;
cout << "创建单链表" << endl;
if (InitList(list)) cout << "创建成功" << endl;
cout << "-----------------" << endl << endl;
cout << "你要输入几个元素?" << endl;
cin >> n;
cout << "请依次输入元素,中间用空格隔开" << endl;
CreatList_R(list, n);
cout << "-----------------" << endl << endl;
cout << "输出单链表" << endl;
print(list, n);
cout << "单链表长度为" << n << endl;
cout << "-----------------" << endl << endl;
cout << "判断单链表是否为空" << endl;
if (Judge(list)) cout << "不为空" << endl;
else cout << "为空" << endl;
cout << "-----------------" << endl << endl;
cout << "输出单链表第3个元素" << endl;
if (n < 3) cout << "第3个元素不存在" << endl;
else {
int tmp = 0;
GetElem(list, 3, tmp);
cout << "第3个元素为" << tmp << endl;
}
cout << "-----------------" << endl << endl;
cout << "你想找哪个元素的地址?请输入此元素" << endl;
int d; cin >> d;
cout << LocateElem(list, d) << endl;//这里
cout << "-----------------" << endl << endl;
cout << "在第4个元素位置上插入f元素,请输入f" << endl;
int f; cin >> f;
n++;
if (ListInsert(list, 4, f)) cout << "插入成功" << endl;
else cout << "插入失败" << endl;
cout << "-----------------" << endl << endl;
cout << "输出插入后的单链表" << endl;
print(list, n);
cout << "删除单链表中第2个元素" << endl;
n--;
if (ListDelete(list, 2)) cout << "删除成功" << endl;
else cout << "删除失败" << endl;
cout << "-----------------" << endl << endl;
cout << "输出删除后的单链表" << endl;
print(list, n);
return 0;
}