链表数据结构(C/C++语言实现)
注意:没有使用malloc和free;加了一个头文件,用于清屏和暂停;还有就是一个错误特别容易被忽略,那就是主函数中声明了LinkList p,然后就直接创建链表,忘了给p分配空间。一定要先初始化链表再建立。以下代码说白了就是一个个的函数堆出来的,只是要注意函数的参数有时候有引用符&,有时候没有,我总结了一个便于记忆的小技巧:如果你想要对链表做出任何改变,请一定加上&;如果你对链表不想做出改变,就可以不用加,无论你加还是不加,为了保险,可以都加上。如果擅长用指针的话,就忽略从此段话!!!!!
#include<iostream> #include<cstdlib> using namespace std; struct LNode{ int data; LNode* next; }; typedef LNode *LinkList; //函数声明 void show(); void InitList(LinkList &L); int CreateList(LinkList &L,int n); int InsertList(LinkList &L,int index,int e); string GetElem(LinkList L,int index,int &e); int deleteList(LinkList &L,int index,int &e); void PrintList(LinkList L); int main(){ int action,length,index,result,e; string res; LinkList L; show(); while(cin>>action){ switch(action){ case 1://初始化链表 system("cls"); InitList(L); break; case 2://建立链表 system("cls"); cout<<"请输入链表的长度:"<<endl; cin>>length; result=CreateList(L,length); if(!result){ cout<<"创建链表失败!"<<endl; } else { cout<<"创建链表成功!"<<endl; } break; case 3://向链表中插入数据 system("cls"); cout<<"请输入想要插入的位置和插入元素的值:"<<endl; cin>>index>>e; InsertList(L,index,e); break; case 4://获取索引为index的元素值 system("cls"); cout<<"请输入索引:"<<endl; cin>>index; res=GetElem(L,index,e); if(res=="yes"){ cout<<"第"<<index<<"个数是"<<e<<endl; } else { cout<<"未找到该索引的值"<<endl; } break; case 5://删除索引为index的值 system("cls"); cout<<"请输入想要删除的数的索引:"<<endl; cin>>index; deleteList(L,index,e); cout<<"第"<<index<<"个元素已经被删除!"<<endl; break; case 6://打印链表 system("cls"); cout<<"链表内容为:"<<endl; PrintList(L); break; case 7://退出 return 0; } system("pause");//暂停 system("cls");//清屏 show(); } } //主界面 void show(){ cout<<"+----------------------------------------+"<<endl; cout<<"| |"<<endl; cout<<"| 1->初始化链表 |"<<endl; cout<<"| 2->创建链表 |"<<endl; cout<<"| 3->插入结点 |"<<endl; cout<<"| 4->查找结点 |"<<endl; cout<<"| 5->删除节点 |"<<endl; cout<<"| 6->打印链表 |"<<endl; cout<<"| 7->退出 |"<<endl; cout<<"| |"<<endl; cout<<"+----------------------------------------+"<<endl; } //初始化链表 void InitList(LinkList &L){ L=new LNode; cout<<"链表初始化成功!"<<endl; } //创建链表 //尾插法,最先进入的元素在最末尾 //int CreateList(LinkList &L,int n){ // cout<<"请依次输入结点的值:"<<endl; // L->next=NULL; // int i; // for(i=0;i<n;i++){ // LinkList p=new LNode; // cin>>p->data; // p->next=L->next; // L->next=p; // } // if(i!=n){ // return 0;//失败 // } else { // return 1;//成功 // } //} //正序创建,按照输入顺序存储 int CreateList(LinkList &L,int length){ cout<<"请依次输入结点的值:"<<endl; LinkList p,q; L->next=NULL; p=L; for(int i=0,x;i<length;i++){ LinkList q=new LNode; cin>>x; q->data=x; p->next=q; p=p->next; } p->next=NULL; return 1; } //获取第i个结点的值 string GetElem(LinkList L,int i,int &e){ LinkList p; p=L->next; int j=1; while(p&&j<i){ p=p->next; j++; } if(!p||j>i){ return "no";//未找到 } else { e=p->data; return "yes";//找到 } } //将值为e的结点插入到第i个位置 int InsertList(LinkList &L,int i,int e){ LinkList p; p=L; int j=0; while(p&&j<i-1){ p=p->next; j++; } if(!p||j>i-1){ return 0; //失败 } else { LinkList s=new LNode; s->data=e; s->next=p->next; p->next=s; return 1;//成功 } } //删除第i个结点,并将结点的值保存到e中 int deleteList(LinkList &L,int i,int &e){ LinkList p,q; p=L; int j=0; while(p->next&&j<i-1){ p=p->next; j++; } if(!(p->next)&&j>i-1){ return 0; } q=p->next; p->next=q->next; e=q->data; delete q;//释放q结点,节约空间 return e; } //打印链表 void PrintList(LinkList L){ LinkList p; p=L; while(p->next){ p=p->next; cout<<p->data<<" "; } cout<<endl; }
如需转载,请注明文章出处,谢谢!!!