如何使用一個尾指針來達到單鏈表的連續插入?

單鏈表的操做

文檔聲明

本鏈表僅有的特殊之處就是設置了一個尾指針,以便達到前插法、後插法插入數據以前不會重置表的目的,簡單說就是一個表,按照書上的寫法,前插1,2,3,後插1,2,3以後鏈表是1 2 3。個人寫法鏈表會是3->2->1->1->2->3。函數

建立單鏈表

1.頭文件及宏定義

#include<iostream>
#include<stdio.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2

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;
*/

3.聲明函數以及定義全局變量

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();//菜單界面

4.主函數

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;
}

5.initList

Status initList(LinkList &L){
    L=new LNode;
    L->next=NULL;
    t=L;
    return OK;
}

6.CreateList_L

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;
    }
}

7.CreateList_R

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;
}

8.GetElem

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;
}

9.ListDelete

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;
}

10.ListPrint

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");
}

11.insert

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;
}

12.findMax

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;
}

13.print

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;
}
相關文章
相關標籤/搜索