#include<bits/stdc++.h>
//链表:初始化、创建()、取值、查询、插入、删除、销毁、清空、求长度、判断空、排序、修改、去重、遍历
using namespace std;
typedef struct{
double price;
}book;
typedef struct Lnode{
book data;
struct Lnode *next;
}Lnode,*Linklist;//Lnode可以用于创建结点,Linklist可以用于创建指向结点 的指针
void Front(Linklist &l);
void Back(Linklist &l);
int Length(Linklist l);
//初始化
void Init(Linklist &l){
l = new Lnode;//创建头结点
l->next = NULL;//头结点指针域为空
}
//创建
void Creat(Linklist &l){
cout<<"1、前插法;2、尾插法";
int n;
cin>>n;
if(n==1) Front(l);
else Back(l);
}
//前插法
void Front(Linklist &l){
int n;
cout<<"结点个数:";
cin>>n;
while(n--){
Linklist p = new Lnode;//生成新结点
cout<<"-->";
cin>>p->data.price;
p->next = l->next;//p指向首元结点
l->next = p;//指向首元结点的指针指向p
}
}
//尾插法
void Back(Linklist &l){
int n;
cout<<"结点个数:";
cin>>n;
Linklist r = l;//设立尾指针
while(n--){
Linklist p = new Lnode;//生成新结点
cout<<"-->";
cin>>p->data.price;
p->next = NULL;//p指针域为空
r->next = p;//尾指针结点指向p
r = p;//尾指针指向p
}
}
//插入
void Insert(Linklist &l,int pos,book e){
if(pos<1 || pos>Length(l)) exit(0);//删除位置不合法
Linklist p = l;//p指向头结点
while(--pos)
p = p->next;
Linklist q = new Lnode;//建立新结点
q->data.price = e.price;
q->next = p->next;
p->next = q;
}
//删除
void Delete(Linklist &l,int pos){
if(pos<1 || pos>Length(l)) exit(0);//删除位置不合法
Linklist p = l;//p指向头结点
while(pos--){
p = p->next;//p指向下一结点
cout<<pos;
}
p->next = p->next->next;
}
//取值
void GetElem(Linklist l,int pos,book &e){
int len = Length(l);
if(pos<1||pos>len) exit(0);
Linklist p = l;//指针p指向头结点
while(pos--){
p=p->next;//找到第pos个元素
}
e.price = p->data.price;//保存找到信息
cout<<p->data.price;
}
//查询
void Search(Linklist l,book e){
Linklist p = l->next;//指针p指向首元结点
int pos = 0;
for(int i=0;i<Length(l);i++){
pos++;
if(p->data.price==e.price){
cout<<pos;
}
}
}
//去重
void Dedup(Linklist &l){
int len = Length(l);
Linklist p = l->next;//p指向首元结点
while(p){//类似冒泡排序
Linklist q = p->next;
while(q){//q用来找相同元素
if(q->data.price==p->data.price){// 相同则删除结点
Linklist x = q;
q = q->next;
p->next = q;
delete x;
}
else
q = q->next;
}
p = p->next;
}
}
//修改
void Revise(Linklist &l){
cout<<"输入修改原信息:";
double p;
cin>>p;
Linklist pi = l->next;//p指向首元结点
for(int i = 0;i<Length(l);i++){
if(pi->data.price == p){
cout<<"修改为:";
double x;
cin>>x;
pi->data.price = x;
break;
}
pi = pi->next;
}
}
//遍历
void Traversal(Linklist l){
Linklist p = l->next;//指针p指向首元结点
for(int i=Length(l);i>0;i--){
cout<<p->data.price<<endl;
p = p->next; //指向下一结点
}
}
//求长度
int Length(Linklist l){
int len = 0;
Linklist p = l->next;//指针指向首元结点
while(p){//当前指针不为空
len++;
p = p->next;//指向下一个
}
return len;
}
//判断空
bool Empty(Linklist l){
if(l->next==NULL) return 1;//首元结点不存在为空
return 0;
}
//清空
void Clear(Linklist &l){
Linklist p = l->next;//指针p指向首元结点
while(p){
Linklist q = p->next;//指针q指向p的下一个结点
delete p;//删除p结点
p = q;//p指向q的地址
}
l->next = NULL;//头结点指向空
}
//销毁
void Destory(Linklist &l){
Linklist p = l;//指针p指向头结点
while(p){
Linklist q = p->next;//指针q指向p的下一结点
delete p; //删除p结点
p = q;//p指向q的地址
}
}
//排序
void Sort(Linklist &l){
int len = Length(l);
Linklist p = l->next;//p指向首元结点
for(int i=0;i<len-1;i++){
Linklist q = p->next;
for(int j=i+1;j<len;j++){
if(p->data.price > q->data.price){
swap(p->data.price,q->data.price);
}
q = q->next;
}
p = p->next;
}
}
int main(){
Linklist l;
Init(l);
Creat(l);
//caozuo
Traversal(l);
return 0;
}
链表的基本操作(代码)
于 2023-10-30 18:35:35 首次发布