#include <iostream>
using namespace std;
//定义指针结构体
struct Node {
int data;//当前节点数据
Node *next;//下一个节点地址
};
class LinkList {
public:
LinkList();
LinkList(int a[], int n);
~LinkList();
int Length();
int Get(int i);
int Locate(int x);
void Insert(int i, int x);
int Delete(int i);
int Empty();
void PrintList();
private:
Node *first;
};
LinkList::LinkList() {
first = new Node;
first->next = nullptr;
}
int LinkList::Empty() {
if (first->next == nullptr) {
return 1;
}
return 0;
}
void LinkList::PrintList() {
Node *p = first->next;
while (p != nullptr) {
cout << p->data << "\t";
p = p->next;
}
cout << endl;
}
int LinkList::Length() {
Node *p = first->next;
int count = 0;
while (p != nullptr) {
p = p->next;
count++;
}
return count;
}
int LinkList::Get(int i) {
Node *p = first->next;
int count = 1;
while (p != nullptr && count < i) {
p = p->next;
count++;
}
if (p == nullptr) throw "查找位置错误";
else return p->data;
}
int LinkList::Locate(int x) {
Node *p = first->next;
int count = 1;
while (p != nullptr) {
if (p->data == x) return count;
p = p->next;
count++;
}
return 0;
}
void LinkList::Insert(int i, int x) {
Node *p = first->next, *s = nullptr;
int count;
while (p != nullptr && count < i - 1) {
p = p->next;
count++;
}
if (p == nullptr) throw "插入位置错误";
else {
s = new Node;
s->data = x;
s->next = p->next;
p->next = s;
}
}
/**
* 头插法
* */
LinkList::LinkList(int a[], int n) {
first = new Node;
first->next = nullptr;
for (int i = 0; i < n; i++) {
Node *s = nullptr;
s = new Node;
s->data = a[i];
s->next = first->next;
first->next = s;
}
}
/**
* 尾插法
* */
/*LinkList::LinkList(int a[], int n) {
first = new Node;
Node *r = first, *s = nullptr;
for (int i = 0; i < n; i++) {
s = new Node;
s->data = a[i];
r->next = s;
r = s;
}
r->next = nullptr;
}*/
int LinkList::Delete(int i) {
int x;
Node *p = first, *q = nullptr;
int count = 0;
while (p != nullptr && count < i - 1) {
p = p->next;
count++;
}
if (p == nullptr || p->next == nullptr)
throw "删除位置错误";
else {
q = p->next;
x = q->data;
p->next = q->next;
delete q;
return x;
}
}
LinkList::~LinkList() {
Node *p = first->next;
while (first != nullptr) {
first = first->next;
delete p;
p = first;
}
}
int main() {
int r[5] = {1, 2, 3, 4, 5}, i, x;
LinkList L{r, 5};
cout << "当前线性表数据为:";
L.PrintList();
try {
L.Insert(2, 8);
cout << "执行插入操作后数据为";
L.PrintList();
} catch (char *str) {
cout << str << endl;
}
cout << "当前单链表的长度为:" << L.Length() << endl;
cout << "请输入查找的元素值:";
cin >> x;
i = L.Locate(x);
if (i > 0) cout << "元素" << x << "的位置为" << i << endl;
else cout << "单链表中没有元素" << x << endl;
try {
cout << "请输入要删除的第几个元素:";
cin >> i;
x = L.Delete(i);
cout << "删的元素值是:" << x << ",执行删除操作后的数据为:";
L.PrintList();
} catch (char *str) {
cout << str << endl;
}
return 0;
}
C++实现简单单链表并初始化使用
最新推荐文章于 2024-05-15 03:48:59 发布