实验目的:
(1)复习C语言程序设计;
(2)掌握指针应用,掌握链表的简单操作。
实验内容与要求:
(1)定义节点结构;
(2)完成单链表任意节点的插入、删除及遍历功能。
#include<iostream>
using namespace std;
struct ListNode {
int value;
ListNode* next;
};
class LinkList {
private:ListNode* head;
int size; //链表长度
public:
//定义头结点
LinkList() {
head = new ListNode;
head->value = 0;
head->next = NULL;
size = 0;
}
//创建链表
void create() {
int n;
cout << "输入创建链表的长度:";
cin >> n;
this->size = n;
ListNode* p1 = NULL;
ListNode* p2 = NULL;
p1 = this->head;
cout << "输入数据:";
for (int i = 0; i < n; i++) {
p2 = new ListNode;
p2->next =NULL;
cin >> p2->value;
p1->next = p2;
p1 = p2;
}
this->head = this->head->next; //去掉初始定义的头结点
if (size != 0)cout << "创建成功!";
}
//任意节点的插入
void insert() {
cout << "输入插入节点的位置(第*个的后面)和数据大小:";
int n, value;
cin >> n >> value;
ListNode* p1 = NULL;
ListNode* p2 = NULL;
p1 = this->head;
//头插
if (n == 0) {
p2 = new ListNode;
p2->value = value;
p2->next = p1;
this->head = p2;
}
//中部插入
if (n > 0 && n < size) {
for (int i = 1; i < n; i++) {
p1 = p1->next;
}
p2 = new ListNode;
p2->value = value;
p2->next = p1->next;
p1->next = p2;
}
//尾部插入
if (n == size) {
for (int i = 1; i <n; i++) {
p1 = p1->next;
}
p2 = new ListNode;
p2->value = value;
p2->next = NULL;
p1->next = p2;
}
if (n > size||n<0) { cout << "error"; }
else { this->size++; cout << "插入成功";
}
}
//任意节点的删除
void remove() {
cout << "输入删除节点的位置(第*个):";
int n;
cin >> n;
ListNode* p1 = head;
//删除头结点
if (n == 1)head = head->next;
//删除其余节点
if (n > 1&&n<=size) {
for (int i = 2; i < n; i++) {
p1 = p1->next;
}
if (p1 != nullptr && p1->next != nullptr) {
p1->next = p1->next->next;
}
}
if (n<0 || n>size)cout << "error";
else { cout << "删除成功"; }
}
//单链表遍历
void print() {
ListNode* ptr = this->head;
while (ptr != nullptr) {
cout << ptr->value << " ";
ptr = ptr->next;
}
if(size==0)cout << endl << "遍历失败!";
else {
cout << endl << "遍历成功!";
}
}
};
//菜单
void show(){
cout << "---1.创建单链表" << endl;
cout << "---2.插入任意节点" << endl;
cout << "---3.删除任意节点" << endl;
cout << "---4.遍历" << endl;
cout << "---0.退出" << endl;
cout << endl;
}
int main() {
LinkList L;
int n;
while (1) {
show();
cin >> n;
if (n == 0)break;
if (n == 1)L.create();
if (n == 2)L.insert();
if (n == 3)L.remove();
if (n == 4)L.print();
if(n<0||n>5){
cout << "无效指令";
}
if (cin.get() == '\n') {
cout <<endl<<endl<< "按下回车健执行下一步";
if (cin.get() == '\n')
system("cls ");
}
}
}
以菜单形式展示