数据结构之链表的基本操作
链表的基本操作。
#include<iostream>
#include<cstring>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList &L){//建立一个空链表
L=new LNode;
L->next=NULL;
return OK;
}
Status InputList(LinkList &L,ElemType n){//前插法输入链表中的数据
LNode *p,*r;//LNode *p与LinkList p的作用是一样的
int i;
// L=new LNode;
r=L;
cout<<"请输入"<<n<<"个数字:"<<endl;
for(i=0;i<n;i++){ //for(i=n-1;i>=0;i--)此为后插法
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
return OK;
}
Status GetNumber(LinkList L,int i,ElemType &num){//根据在链表中的位置搜索该位置的数值
LNode *p;
int j;
j=0;
p=L->next;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
num=p->data;
return OK;
}
Status GetAdress(LinkList L,ElemType num){//根据所给的数值输出该数字在链表中的位置
LNode *p;
int cas=1;
p=L->next;
while(p&&p->data!=num){
p=p->next;//printf("right\n");
++cas;
}
return cas;
}
Status InsertList(LinkList &L,int i,ElemType &num){//在链表中进行插入操作
LNode *p,*s;
int j=0;
p=L;
while(p&&j<i-1){
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=new LNode;
s->data=num;
s->next=p->next;
p->next=s;
return OK;
}
Status DeleteList(LinkList &L,int i,ElemType &n){//删除链表中的数据
LNode *p,*q;
p=L;
int j=0;
while(p->next&&j<i-1){
p=p->next;
++j;
// cout<<"ERROR"<<endl;
}
if(!(p->next)||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
n=q->data;
delete q;
return OK;
}
void OutputList(LinkList L){//输出链表中的数据
LinkList p;
p=L->next;
while(p){
// cout<<ERROR;
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
// return OK;
}
int main(){
int temp,num_a,num_b,num_c,num_d;
LinkList L;
LinkList R;
int num_deal,flag;
cout<<"1. 建立链表\n";
cout<<"2. 输入数据\n";
cout<<"3. 按位置查找\n";
cout<<"4. 按值查找\n";
cout<<"5. 链表的插入\n";
cout<<"6. 链表的删除\n";
cout<<"7. 输出数据\n";
cout<<"0. 退出\n\n";
while(true){
cout<<"请输入你的选项:"<<endl;
cin>>temp;
if(temp==0)
break;
flag=0;
switch(temp){
case 1:
flag=InitList(L);
if(flag)
cout<<"链表建立成功!"<<endl;
else
cout<<"链表建立失败!"<<endl;
break;
case 2:
int ans_fir;
cout<<"请输入你想要输入的数据的个数:"<<endl;
cin>>ans_fir;
flag=InputList(L,ans_fir);
if(flag)
cout<<"操作成功!"<<endl<<endl;
else
cout<<"操作失败!"<<endl<<endl;
break;
case 3:
int ans_sec;
cout<<"请输入你所要查找的位置:"<<endl;
cin>>ans_sec;
flag=GetNumber(L,ans_sec-1,num_a);
if(flag)
cout<<"你所要查找的位置的数字为"<<num_a<<endl<<endl;
else
cout<<"搜索失败!"<<endl<<endl;
break;
case 4:
int ans_thi;
cout<<"请输入你所要查找的数字:"<<endl<<endl;
cin>>ans_thi;
flag=GetAdress(L,ans_thi);
if(flag)
cout<<"你所要查找的数字的位置为"<<flag<<endl<<endl;
else
cout<<"查找失败!"<<endl;
break;
case 5:
int ans_for,ans_fif;
cout<<"请输入你所要插入的位置和数字:"<<endl<<endl;
cin>>ans_for>>ans_fif;
flag=InsertList(L,ans_for,ans_fif);
if(flag)
cout<<"插入成功!"<<endl<<endl;
else
cout<<"插入失败!"<<endl<<endl;
break;
case 6:
int ans_six;
cout<<"请输入你所要删除的数字的位置:"<<endl<<endl;
cin>>ans_six;
flag=DeleteList(L,ans_six,num_c);
if(flag)
cout<<"你所要删除的数字为:"<<num_c<<endl<<endl;
else
cout<<"该数字无法删除!"<<endl<<endl;
break;
case 7:
OutputList(L);
break;
default:
cout<<"操作不合法!"<<endl<<endl;
break;
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理