//
// Created by 86135 on 2023/3/16.
//
#include "LinkList.h"
#include<iostream>
using namespace std;
const int MaxSize=100;
struct Node{
int data; //数据域
Node* next; //指针域
};
class LinkList {
public:
LinkList(); //建立只有头结点的空链表
LinkList(int a[],int n); //建立n各元素的单链表
~LinkList(); //析构函数
int Length(); //返回单链表的长度
int Get(int i); //按位查找
int Locate(int x); //按值查找
void Insert(int i,int x); //插入操作
int Delete(int i); //删除第i个元素
int Empty(); //判断单链表是否为空
void PrintList(); //打印单链表
int MAX(); //找最大值
private:
Node* first; //单链表的头指针
};
//无参构造函数--单链表的初始化
LinkList::LinkList() {
first=new Node; //生成头结点
first->next=NULL; //头结点的指针域置空
}
//遍历操作
void LinkList::PrintList() {
Node *p=first->next;
while(p!=NULL){
cout<<p->data<<"\t";
p=p->next; //工作p指针后移
}
cout<<endl;
}
//单链表的长度
int LinkList::Length() {
// 定义一个工作指针
Node *p=first->next;
int count=0;
while (p!=NULL){
p=p->next;
count++;
}
return count;
}
//头插法
//LinkList::LinkList(int a[],int n) {
// first=new Node;
// first->next=NULL; //初始化一个空链表
// for (int i = 0; i < n; ++i) {
// Node *s=NULL;
// 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=NULL;
for (int i = 0; i < n; ++i) {
s=new Node;
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL; //单链表建立完毕后,将终端节点的指针域置空
}
//插入操作
void LinkList::Insert(int i, int x) {
Node *p=first,*s=NULL;
int count=0;
while (p!=NULL && count<i-1){ //查找第i-1个结点,
p=p->next;
count++;
}
if (p==NULL) throw "插入位置错误";
else{
s=new Node;
s->data=x;
s->next=p->next;
p->next=s;
}
}
//删除操作
int LinkList::Delete(int i) {
int s;
Node *p=first,*q=NULL;
int count=0;
while(p!=NULL && count<i-i){
p=p->next;
count++;
}
if (p==NULL || p->next==NULL) throw "删除位置错误";
else{
q=p->next;
s=q->data;
p->next=q->next; //删除结点
return s;
}
}
//按值查找
int LinkList::Locate(int x) {
Node *p=first->next;
int count=1;
while(p!=NULL){
if (p->data==x){
return count;
} else{
p=p->next;
count++;
}
}
return 0;
}
//按位查找
int LinkList::Get(int i) {
Node *p=first->next;
int count=1;
while (p!=NULL && count<i){
p=p->next;
count++;
}
if (p==NULL) throw "查找位置错误";
else return p->data;
}
//析构函数
LinkList::~LinkList() {
Node *p=NULL;
while(first!=NULL){
p=first;
first=first->next;
delete p;
}
}
//寻找链表中的最大值(最小值同理可得)
int LinkList::MAX() {
int max=-1000000;
Node *p=first->next;
while(p!=NULL){
if (p->data>max){
max=p->data;
}
p=p->next;
}
return max;
}
int main(){
int n ; //定义线性表的元素个数
cin >> n; //输入n
int a[n];
int i, x;
cout << "输入数据元素:" << endl;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
LinkList l( a, n);
cout << "当前线性表的数据为:";
l.PrintList();
int max=l.MAX();
cout<<max<<endl;
int maxx = -1000000;
int min = 1000000;
for (int i = 0; i < 10; i++) {
if(a[i] > maxx) maxx = a[i];
if(a[i] < min) min = a[i];
}
cout << "最大元素为:" << maxx << endl;
cout << "最小元素为:" << min << endl;
cout << "请输入要插入的位置i" << endl;
cin >> i;
cout << "请输入要插入的数x" << endl;
cin >> x;
cout << "在第i个位置插入x" << endl;
l.Insert(i, x);
cout << "执行插入操作后数据为:";
l.PrintList();
cout << "请输入要删除的元素位置i" << endl;
cin >> i;
x = l.Delete(i);
cout << "删除的元素是" << x << ",删除后数据为:";
l.PrintList();
}
单链表的使用
于 2023-03-16 19:20:21 首次发布