1、DS顺序表--储存结构与操作
#include <iostream>
using namespace std;
struct Node {
int data{};
Node *next = nullptr;
};
int n, Index, number;
Node *head = new Node;
// 打印数据
void print() {
Node *p = head->next;
cout << n << " ";
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
// 插入数据
void insert(int idx, int num) {
if (idx < 1 || idx > n + 1) {
cout << "error" << endl;
return;
}
Node *p = head;
for (int i = 1; i < idx; i++) p = p->next;
Node *temp = new Node;
temp->data = num;
temp->next = p->next;
p->next = temp;
n++;
print();
}
// 删除数据
void remove(int idx) {
if (idx < 1 || idx > n) {
cout << "error" << endl;
return;
}
Node *p = head;
for (int i = 1; i < idx; i++) p = p->next;
if (p->next->next != nullptr)
p->next = p->next->next;
else
p->next = nullptr;
n--;
print();
}
// 查找数据
void search(int idx) {
if (idx < 1 || idx > n) {
cout << "error" << endl;
return;
}
Node *p = head;
for (int i = 0; i < idx; i++) p = p->next;
cout << p->data << endl;
}
int main() {
cin >> n;
Node *p = head;
for (int i = 0; i < n; i++) {
cin >> number;
Node *temp = new Node;
temp->data = number;
p->next = temp;
p = temp;
}
print();
// 插入数据
for (int i = 1; i <= 2; i++) {
cin >> Index >> number;
insert(Index, number);
}
// 删除数据
for (int i = 0; i < 2; i++) {
cin >> Index;
remove(Index);
}
// 查找数据
for (int i = 0; i < 2; i++) {
cin >> Index;
search(Index);
}
return 0;
}
2、DS顺序表--连续操作
#include <iostream>
using namespace std;
struct Node {
int data{};
Node *next = nullptr;
};
int n, Index, number;
Node *head = new Node;
// 打印数据
void print() {
Node *p = head->next;
cout << n << " ";
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
// 插入数据
void insert(int idx, int num) {
if (idx < 1 || idx > n + 1) {
cout << "error" << endl;
return;
}
Node *p = head;
for (int i = 1; i < idx; i++) p = p->next;
Node *temp = new Node;
temp->data = num;
temp->next = p->next;
p->next = temp;
n++;
}
// 删除数据
void remove(int idx) {
if (idx < 1 || idx > n) {
cout << "error" << endl;
return;
}
Node *p = head;
for (int i = 1; i < idx; i++) p = p->next;
if (p->next->next != nullptr)
p->next = p->next->next;
else
p->next = nullptr;
n--;
}
// 查找数据
void search(int idx) {
if (idx < 1 || idx > n) {
cout << "error" << endl;
return;
}
Node *p = head;
for (int i = 0; i < idx; i++) p = p->next;
cout << p->data << endl;
}
int main() {
cin >> n;
Node *p = head;
for (int i = 0; i < n; i++) {
cin >> number;
Node *temp = new Node;
temp->data = number;
p->next = temp;
p = temp;
}
print();
// 插入数据
cin >> Index >> number;
for (int i = 0; i < number; i++) {
int temp; cin >> temp;
insert(Index+i, temp);
}print();
// 删除数据
cin >> Index >> number;
for (int i = 0; i < number; i++) {
remove(Index);
}print();
return 0;
}
3、DS顺序表之循环移位
// 循环移位
/*
* 左移 (index - Left + len)% len
* 右移 (index + Right) % len
* */
#include "iostream"
using namespace std;
const int N = 100010;
int arr[N], temp[N];
int len;
void moveLeft(int left) {
int index = 0;
for (int i = 0; i < len; i++) {
index = (i - left + len) % len;
temp[index] = arr[i];
}
for (int i = 0; i < len; i++) {
arr[i] = temp[i];
cout << arr[i] << " ";
}
cout << endl;
}
void movRight(int Right) {
int index = 0;
for (int i = 0; i < len; i++) {
index = (i + Right) % len;
temp[index] = arr[i];
}
for (int i = 0; i < len; i++) {
arr[i] = temp[i];
cout << arr[i] << " ";
}
cout << endl;
}
int main() {
int shift, num;
cin >> len;
for (int i = 0; i < len; i++) cin >> arr[i];
for (int i = 0; i < len; i++) cout << arr[i] << " ";
cout << endl;
for(int i = 0;i < 2;i++){
cin >> shift >> num;
if (shift == 0) {
moveLeft(num);
} else {
movRight(num);
}
}
return 0;
}
4、DS单链表--存储结构与操作
注: 本题我是用数组模拟实现 样例通过,但是后台没有通过,大概率是后台要求使用链表实现
#include "iostream"
using namespace std;
const int N = 7;
int head, idx, len;
int val[N], ne[N];
void info() {
head = -1;
idx = 1;
len = 0;
}
void print() {
for (int i = head; i != -1; i = ne[i]) {
cout << val[i] << " ";
}
cout << endl;
}
void add_to_head(int value) {
val[idx] = value;
ne[idx] = head;
head = idx;
idx++;
len++;
}
bool add_to_index(int index, int value) {
// 判断插入位置是否合法
if (index < 1 || index > len + 1) {
cout << "error" << endl;
return false;
}
val[idx] = value;
ne[idx] = ne[index];
ne[index] = idx;
idx++;
len++;
return true;
}
bool remove(int index) {
if (index < 0 || index >= len) {
cout << "error" << endl;
return false;
}
if (index == 0) {
head = ne[head];
} else {
int prev = head;
for (int i = 0; i < index - 1; i++) {
prev = ne[prev];
}
ne[prev] = ne[ne[prev]];
}
len--;
return true;
}
void find(int index) {
if (index <= 0 || index > len) {
cout << "error" << endl;
return;
}
int current = head;
for (int i = 1; i < index; i++) {
current = ne[current];
}
cout << val[current] << endl;
}
int main() {
info();
int n, Index, num;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> num;
if (i == 0) add_to_head(num);
else add_to_index(len, num);
}
print();
// 添加数据
for (int i = 0; i < 2; i++) {
cin >> Index >> num;
if (Index == 1) {
add_to_head(num);
print();
} else if (add_to_index(Index - 1, num))
print();
}
// 删除数据
for (int i = 0; i < 2; i++) {
cin >> Index;
if(remove(Index - 1))
print();
}
// 查找数据
for (int i = 0; i < 2; i++) {
cin >> Index;
find(Index);
}
return 0;
}
5、DS单链表--节点交换
#include "iostream"
using namespace std;
void print();
// 链表节点定义
struct Node {
int data;
Node *next;
Node() {
this->data = 0;
this->next = nullptr;
}
};
int n; // 初始链表长度
int idx1, idx2; // 表示需要交换的节点
Node *head = new Node; // 定义初始节点 头节点不存储数据
Node *getIdx(int num) {
Node *p = head;
for (int i = 0; i < num - 1; i++) p = p->next; // 返回该节点的上一个节点
return p; // 返回链表节点
}
void swapNode(int index1, int index2) {
// 判断数据是否合法
if (index1 < 1 || index1 > n || index2 < 1 || index2 > n) {
cout << "error" << endl;
return;
}
Node *p_1_Pre = getIdx(index1);
Node *p_2_Pre = getIdx(index2);
Node *p_idx1 = p_1_Pre->next; //需要交换的节点
Node *p_idx2 = p_2_Pre->next; // 需要交换的节点
if (p_idx1->next == p_idx2) { // 两个链表相邻
p_idx1->next = p_idx2->next;
p_1_Pre->next = p_idx2;
p_idx2->next = p_idx1;
} else {
// 如果两个链表不相邻
auto p_2_next = p_idx2->next;
p_idx2->next = p_idx1->next;
p_idx1->next = p_2_next;
p_2_Pre->next = p_idx1;
p_1_Pre->next = p_idx2;
}
print();
}
void print() {
Node *p = head->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
cin >> n;
Node *p = head;
for (int i = 0; i < n; i++) {
Node *temp = new Node;
cin >> temp->data; // 输入链表的节点值
p->next = temp; // 将链表连接起来
p = temp;
} // 链表初始化完成
print();
for (int i = 0; i < 2; i++) {
cin >> idx1 >> idx2;
swapNode(idx1, idx2);
}
return 0;
}
6、DS单链表--合并
注: 我本来是想在代码结束后释放内存的,但是释放内存后在Cline中运行正常,但是OJ平台出现异常,不管了,直接将释放内存的代码注释掉就可以了!!
#include "iostream"
using namespace std;
struct Node {
int data;
Node *next;
Node() {
this->data = 0;
this->next = nullptr;
}
};
// 创建链表
void setNode(Node *head, int num) {
Node *p = head;
for (int i = 0; i < num; i++) {
Node *temp = new Node;
cin >> temp->data;
p->next = temp;
p = temp;
}
}
// 遍历打印链表
void print(Node *head) {
Node *p = head->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
// 将链表h1 和 h2合并 到链表 h
Node *combine(Node *h, Node *h1, Node *h2) {
Node *p = h, *p1 = h1->next, *p2 = h2->next;
while (p1 && p2) {
Node *temp;
if (p1->data < p2->data) {
temp = p1;
p1 = p1->next;
} else {
temp = p2;
p2 = p2->next;
}
p->next = temp;
p = temp;
}// 如果链表1 或者 链表2 没有合并完 继续合并
if (p1) p->next = p1;
else if (p2) p->next = p2;
return h;
}
void release(Node *h) {
while (h) {
Node *temp = h;
h = h->next;
delete temp;
}
}
Node *head1 = new Node;
Node *head2 = new Node;
Node *head = new Node;
int n1, n2;
int main() {
cin >> n1;
// 输入第一个链表
setNode(head1, n1);
// 输入第二个链表
cin >> n2;
setNode(head2, n2);
head = combine(head, head1, head2);
print(head);
// 合并结束后释放内存
// release(head);
// release(head1);
//release(head2);
}