1. 程式人生 > 其它 >單鏈表的基本操作的實現 C++實現

單鏈表的基本操作的實現 C++實現

定義單鏈表結點型別

#include<stdio.h>

//定義單鏈表結點型別
typedef struct LNode{
    int data; //結點的資料域
    LNode *next; //結點的指標域
}LNode, *LinkList; //LinkList為指向結構體LNode的指標型別

單鏈表的初始化

//單鏈表的初始化
void InitList(LinkList &L){
    L=new LNode;//分配一個頭結點 或L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
}

判斷連結串列是否為空

//判斷連結串列是否為空
bool ListEmpty(LinkList L){
    if(L->next==NULL) //判斷頭結點指標域是否為空
        return true;
    else
        return false; 
}

銷燬單鏈表

//銷燬單鏈表
void DestroyList(LinkList &L){
    LNode *p;//或LinkList p;
    while(L){
        p=L;
        L=L->next;
        delete p;
    }
}

清空單鏈表(只留頭結點)

//清空單鏈表(只留頭結點)
void ClearList(LinkList &L){ LNode *p,*q;//或LinkList p,q; p=L->next; //p指向要刪除的結點 while(p){ q=p->next; //q指向要刪除的下一個結點 delete p; p=q; } L->next=NULL; }

求表的長度(從首元結點開始算,頭結點不算)

//求表的長度(從首元結點開始算,頭結點不算)
int ListLength(LinkList L){
    int length=0;
    LNode 
*p; p=L->next; while(p){ length++; p=p->next; } return length; }

取值(取第i個元素)

//取值(取第i個元素)
bool GetElem(LinkList L,int i,int &e){
    LNode *p; //指標p指向當前掃描到的結點
    int j=1; //當前p指向的是第幾個結點
    p=L->next; //初始化,p指向首元結點
    while(p && j<i)//向後掃描,直到p指向第i個元素或p為空
    {
        p=p->next;
        ++j;
    }
    if(!p || j>i) return false; //i值不合法i>n或i≤0
    e=p->data;
    return true;
}

 遍歷

// 遍歷
void PrintList(LinkList L){
    for(int i=0;i<ListLength(L);i++){
        int e;
        GetElem(L,i+1,e);
        printf("第%d個元素的值=%d\n",i+1,e);
    }    
}

按值查詢---返回指向包含這個值的結點的指標

//按值查詢---返回指向包含這個值的結點的指標
LNode *LocateElem(LinkList L,int e){
    LNode *p=L->next;
    //從第1個結點開始查詢資料域為e的結點
    while(p && p->data!=e)
        p=p->next;
    return p; //找到後返回該結點指標,否則返回NULL
}

按值查詢---返回包含這個值的結點的位置序號

//按值查詢---返回包含這個值的結點的位置序號
int Locate(LinkList L,int e){
    LNode *p=L->next;
    int i=1;
    while(p && p->data!=e){
        p=p->next;i++;
    } 
    if(p) return i;
    else return -1; //沒有找到返回-1
}

在第i個位置插入元素e

//在第i個位置插入元素e
bool ListInsert(LinkList &L,int i,int e){
    LNode *p=L; //p指向頭結點
    int j=0;
    while(p && j<i-1){ //查詢第i-1個結點,p指向該結點
        p=p->next;++j;
    }
    if(!p || j>i-1) return false; //i>n+1或i<1,插入位置不合法
    LNode *s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s; //將新結點s連到p之後
    return true; //插入成功
}

刪除第i個元素

//刪除第i個元素
bool ListDelete(LinkList &L,int i, int &e){
    LNode *p=L;int j=0;
    while(p->next && j<i-1){ //查詢第i-1個結點,p指向該結點
        p=p->next;++j;
    }
    if(!(p->next) || j>i-1) return false; //i>n或i<1,刪除位置不合法
    LNode *q=p->next;//令q指向被刪除結點
    e=q->data; //用e返回元素的值
    p->next=q->next; //改變刪除結點前驅結點的指標域
    delete(q);
    return true;
}

頭插法建立單鏈表(逆序排序)

//頭插法建立單鏈表(逆序排序)
void CreateList_H(LinkList &L,int n){
    L=new LNode; //新建頭結點
    L->next=NULL;
    for(int i=0;i<n;++i){
        LNode *p=new LNode;
        printf("請輸入第%d個值:",i+1);
        scanf("%d",&p->data);
        p->next=L->next; //插入到表頭
        L->next=p;
    }
}

尾插法建立單鏈表(順序排序)

//尾插法建立單鏈表(順序排序)
void CreateList_R(LinkList &L,int n){
    L=new LNode;//新建頭結點
    L->next=NULL;
    LNode *r=L; //尾指標:最開始指向頭結點,然後慢慢向後移
    for(int i=0;i<n;++i){
        LNode *p=new LNode;
        printf("請輸入第%d個值:",i+1);
        scanf("%d",&p->data);
        p->next=NULL;
        r->next=p; //新結點插入到表尾
        r=p; //尾指標r指向新的尾結點
    }
}

整個程式程式碼

#include<stdio.h>

//定義單鏈表結點型別
typedef struct LNode{
    int data; //結點的資料域
    LNode *next; //結點的指標域
}LNode, *LinkList; //LinkList為指向結構體LNode的指標型別


//單鏈表的初始化
void InitList(LinkList &L){
    L=new LNode;//分配一個頭結點 或L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
}

//判斷連結串列是否為空
bool ListEmpty(LinkList L){
    if(L->next==NULL) //判斷頭結點指標域是否為空
        return true;
    else
        return false; 
}

//銷燬單鏈表
void DestroyList(LinkList &L){
    LNode *p;//或LinkList p;
    while(L){
        p=L;
        L=L->next;
        delete p;
    }
}

//清空單鏈表(只留頭結點)
void ClearList(LinkList &L){
    LNode *p,*q;//或LinkList p,q;
    p=L->next; //p指向要刪除的結點 
    while(p){
        q=p->next; //q指向要刪除的下一個結點
        delete p;
        p=q;
    }
    L->next=NULL;
}

//求表的長度(從首元結點開始算,頭結點不算)
int ListLength(LinkList L){
    int length=0;
    LNode *p;
    p=L->next;
    while(p){
        length++;
        p=p->next;
    }
    return length;
}


//取值(取第i個元素)
bool GetElem(LinkList L,int i,int &e){
    LNode *p; //指標p指向當前掃描到的結點
    int j=1; //當前p指向的是第幾個結點
    p=L->next; //初始化,p指向首元結點
    while(p && j<i)//向後掃描,直到p指向第i個元素或p為空
    {
        p=p->next;
        ++j;
    }
    if(!p || j>i) return false; //i值不合法i>n或i≤0
    e=p->data;
    return true;
}

// 遍歷
void PrintList(LinkList L){
    for(int i=0;i<ListLength(L);i++){
        int e;
        GetElem(L,i+1,e);
        printf("第%d個元素的值=%d\n",i+1,e);
    }    
}

//按值查詢---返回指向包含這個值的結點的指標
LNode *LocateElem(LinkList L,int e){
    LNode *p=L->next;
    //從第1個結點開始查詢資料域為e的結點
    while(p && p->data!=e)
        p=p->next;
    return p; //找到後返回該結點指標,否則返回NULL
}

//按值查詢---返回包含這個值的結點的位置序號
int Locate(LinkList L,int e){
    LNode *p=L->next;
    int i=1;
    while(p && p->data!=e){
        p=p->next;i++;
    } 
    if(p) return i;
    else return -1; //沒有找到返回-1
}

//在第i個位置插入元素e
bool ListInsert(LinkList &L,int i,int e){
    LNode *p=L; //p指向頭結點
    int j=0;
    while(p && j<i-1){ //查詢第i-1個結點,p指向該結點
        p=p->next;++j;
    }
    if(!p || j>i-1) return false; //i>n+1或i<1,插入位置不合法
    LNode *s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s; //將新結點s連到p之後
    return true; //插入成功
}

//刪除第i個元素
bool ListDelete(LinkList &L,int i, int &e){
    LNode *p=L;int j=0;
    while(p->next && j<i-1){ //查詢第i-1個結點,p指向該結點
        p=p->next;++j;
    }
    if(!(p->next) || j>i-1) return false; //i>n或i<1,刪除位置不合法
    LNode *q=p->next;//令q指向被刪除結點
    e=q->data; //用e返回元素的值
    p->next=q->next; //改變刪除結點前驅結點的指標域
    delete(q);
    return true;
}

//頭插法建立單鏈表(逆序排序)
void CreateList_H(LinkList &L,int n){
    L=new LNode; //新建頭結點
    L->next=NULL;
    for(int i=0;i<n;++i){
        LNode *p=new LNode;
        printf("請輸入第%d個值:",i+1);
        scanf("%d",&p->data);
        p->next=L->next; //插入到表頭
        L->next=p;
    }
}


//尾插法建立單鏈表(順序排序)
void CreateList_R(LinkList &L,int n){
    L=new LNode;//新建頭結點
    L->next=NULL;
    LNode *r=L; //尾指標:最開始指向頭結點,然後慢慢向後移
    for(int i=0;i<n;++i){
        LNode *p=new LNode;
        printf("請輸入第%d個值:",i+1);
        scanf("%d",&p->data);
        p->next=NULL;
        r->next=p; //新結點插入到表尾
        r=p; //尾指標r指向新的尾結點
    }
}

int main(){
    LinkList L;
    //初始化
    InitList(L);

    //尾插法建立單鏈表
    CreateList_R(L,5); //插入5個元素
    printf("*******************\n");

    //求表長
    printf("表的長度=%d\n",ListLength(L));
    //遍歷
    PrintList(L);
    printf("*******************\n");

    //查詢
    printf("值為4的結點位置序號=%d\n", Locate(L,4));
    printf("驗證:值為4的結點的資料域=%d\n", LocateElem(L,4)->data);
    printf("*******************\n");

    //取值(取第i個元素)
    int e;
    GetElem(L,2,e);
    printf("第2個元素的值=%d\n",e);
    printf("*******************\n");

    //在第i個位置插入元素e
    ListInsert(L,6,6);
    printf("表的長度=%d\n",ListLength(L));
    PrintList(L);
    printf("*******************\n");

    //刪除第4個元素
    int k;
    ListDelete(L,4,k);
    printf("表的長度=%d\n",ListLength(L));
    printf("被刪除的第4個元素的值=%d\n",k);
    PrintList(L);

}