目錄ios
本鏈表僅有的特殊之處就是設置了一個尾指針,以便達到前插法、後插法插入數據以前不會重置表的目的,簡單說就是一個表,按照書上的寫法,前插1,2,3,後插1,2,3以後鏈表是1 2 3。個人寫法鏈表會是3->2->1->1->2->3。函數
#include<iostream> #include<stdio.h> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2
typedef int Status; typedef struct LNode{ int x; struct LNode *next; }LNode,*LinkList; //上邊那步能夠分解爲 /* struct LNode{ int x; struct LNode *next; }; typedef struct LNode LNode; typedef struct LNode *LinkList; */
LinkList t;//尾指針 Status initList(LinkList &L);//初始化鏈表 void CreateList_L(LinkList &L,int n);//左(前)插法插入n個數據 void CreateList_R(LinkList &L,int n);//右(後)插法插入n個數據 Status GetElem(LinkList L,int i);//返回第i個結點的值 Status ListDelete(LinkList &L,int i);//刪除第i個結點 void ListPrint(LinkList L);//遍歷鏈表 void insert(LinkList &L,int i);//在第i個結點後插入一個結點 Status findMax(LinkList L);//找出這個鏈表中的最大值 Status print();//菜單界面
int main(){ int x=0,n=0; LinkList L; while(1){ print(); cin>>x; switch(x){ case 1:initList(L);break; case 2:cin>>n; CreateList_L(L,n);break; case 3:cin>>n; CreateList_R(L,n);break; case 4:cin>>n; cout<<GetElem(L,n)<<endl;break; case 5:ListPrint(L);break; case 6:cin>>n; insert(L,n);break; case 7:cout<<findMax(L)<<endl;break; case 8:cin>>n; ListDelete(L,n);break; case 9:return 0; } } return 0; }
Status initList(LinkList &L){ L=new LNode; L->next=NULL; t=L; return OK; }
void CreateList_L(LinkList &L,int n){ for(int i=0;i<n;++i){ LinkList p=new LNode; if(t==L){ t=p; } cin>>p->x; p->next=L->next; L->next=p; } }
void CreateList_R(LinkList &L,int n){ LinkList r=t; for(int i=0;i<n;++i){ LinkList p=new LNode; cin>>p->x; p->next=NULL; r->next=p; r=p; } t=r; }
Status GetElem(LinkList L,int i){ LinkList p=L->next; int j=1; while(p&&j<i){ p=p->next; ++j; } if(!p||j>i){ cout<<"您要查找的元素不合法\n錯誤:"; return -1; } return p->x; }
Status ListDelete(LinkList &L,int i){ LinkList p=L; int j=0; while((p->next)&&(j<i-1)){ p=p->next; ++j; } if(!(p->next)||(j>i-1)){ cout<<"您要刪除的元素不合法\n錯誤:-1\n"; return -1; } LinkList q=p->next; p->next=q->next; delete q; return OK; }
void ListPrint(LinkList L){ LinkList p=L->next; if(p!=NULL){ printf("%d",p->x); p=p->next; } while(p!=NULL){ printf("->%d",p->x); p=p->next; } printf("\n"); }
void insert(LinkList &L,int i){ LinkList p=L; while(i--&&p){ p=p->next; } if(p==NULL||i<-1){ cout<<"您要插入的位置不合法\n錯誤:-1\n"; return; } LinkList q=new LNode; cin>>q->x; q->next=p->next; p->next=q; }
Status findMax(LinkList L){ if(L->next==NULL)return 0; LinkList p=new LNode; p=L->next; int max1=p->x; while(p->next){ p=p->next; max1=max(p->x,max1); } return max1; }
Status print(){ cout<<"==========================================\n"; cout<<"1.建立一個空表\n"; cout<<"2.前插法插入n個數據\n"; cout<<"3.後插法插入n個數據\n"; cout<<"4.獲取第n個結點的值\n"; cout<<"5.遍歷鏈表\n"; cout<<"6.在第n個結點後插入一個結點\n"; cout<<"7.找出這個鏈表的最大值\n"; cout<<"8.刪除第n個結點\n"; cout<<"9.退出系統\n"; cout<<"==========================================\n"; return OK; }
#include<iostream> #include<stdio.h> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef struct LNode{ int x; struct LNode *next; }LNode,*LinkList; LinkList t; Status initList(LinkList &L){ L=new LNode; L->next=NULL; t=L; return OK; } void CreateList_L(LinkList &L,int n){ for(int i=0;i<n;++i){ LinkList p=new LNode; if(t==L){ t=p; } cin>>p->x; p->next=L->next; L->next=p; } } void CreateList_R(LinkList &L,int n){ LinkList r=t; for(int i=0;i<n;++i){ LinkList p=new LNode; cin>>p->x; p->next=NULL; r->next=p; r=p; } t=r; } Status GetElem(LinkList L,int i){ LinkList p=L->next; int j=1; while(p&&j<i){ p=p->next; ++j; } if(!p||j>i){ cout<<"您要查找的元素不合法\n錯誤:"; return -1; } return p->x; } Status ListDelete(LinkList &L,int i){ LinkList p=L; int j=0; while((p->next)&&(j<i-1)){ p=p->next; ++j; } if(!(p->next)||(j>i-1)){ cout<<"您要刪除的元素不合法\n錯誤:-1\n"; return -1; } LinkList q=p->next; p->next=q->next; delete q; return OK; } void ListPrint(LinkList L){ LinkList p=L->next; if(p!=NULL){ printf("%d",p->x); p=p->next; } while(p!=NULL){ printf("->%d",p->x); p=p->next; } printf("\n"); } void insert(LinkList &L,int i){ LinkList p=L; while(i--&&p){ p=p->next; } if(p==NULL||i<-1){ cout<<"您要插入的位置不合法\n錯誤:-1\n"; return; } LinkList q=new LNode; cin>>q->x; q->next=p->next; p->next=q; } Status findMax(LinkList L){ if(L->next==NULL)return 0; LinkList p=new LNode; p=L->next; int max1=p->x; while(p->next){ p=p->next; max1=max(p->x,max1); } return max1; } Status print(){ cout<<"==========================================\n"; cout<<"1.建立一個空表\n"; cout<<"2.前插法插入n個數據\n"; cout<<"3.後插法插入n個數據\n"; cout<<"4.獲取第n個結點的值\n"; cout<<"5.遍歷鏈表\n"; cout<<"6.在第n個結點後插入一個結點\n"; cout<<"7.找出這個鏈表的最大值\n"; cout<<"8.刪除第n個結點\n"; cout<<"9.退出系統\n"; cout<<"==========================================\n"; return OK; } int main(){ int x=0,n=0; LinkList L; while(1){ print(); cin>>x; switch(x){ case 1:initList(L);break; case 2:cin>>n; CreateList_L(L,n);break; case 3:cin>>n; CreateList_R(L,n);break; case 4:cin>>n; cout<<GetElem(L,n)<<endl;break; case 5:ListPrint(L);break; case 6:cin>>n; insert(L,n);break; case 7:cout<<findMax(L)<<endl;break; case 8:cin>>n; ListDelete(L,n);break; case 9:return 0; } } return 0; }