1. 程式人生 > >連結串列學習---------------------------------------頭插法和尾插法建立連結串列並輸出資料

連結串列學習---------------------------------------頭插法和尾插法建立連結串列並輸出資料

連結串列的運算時間效率分析

\bullet 查詢:因為線性連結串列只能順序存取,即在查詢時要從頭指標找起,查詢的時間複雜度為O(n).

\bullet插入和刪除:因為線性連結串列不需要移動元素,只要修改指標,一般情況下時間複雜度為O(1).

\bigstar但是,如果要在單鏈表中進行前插或者刪除操作,由於要從頭查詢前驅結點,所耗時間複雜度為O(n).

我覺得開頭很重要:

typedef struct LNode{
    ElemType data; //資料域,ElemType作用和int一樣
    struct LNode *next; //指標域
}LNode,*LinkList; //*LinkList為LNode型別的指標

注意:上式是一個巨集定義,相當於對結構體型別起了一個別名,LNode  *與LinkList,兩者本質上是等價的。

只不過(1)通常習慣上用LinkList定義單鏈表,強調定義的是單鏈表的頭指標

            (2)用LNode  *定義指向單鏈表中任意結點指標變數

                綜合(1)(2) LNode  *p   <==>  LinkList  p

注意區分指標變數結點變數兩個不同的概念,若用LNode *p語句定義,則p代表指標變數,*p代表結點變數

單鏈表的頭插法(前插法)圖示:

 

核心的程式碼有三句 :

p->data = a; //p為新生成的結點,並輸入資料值為a
p->next = L->next //使新生成的結點的指標域始終指向空(開始頭指標的指標域即是空)
L->next = p //L為頭結點,使新生成的新結點一直在頭結點的緊鄰後面

下面貼上完整的程式碼(輸入五個值,頭插法建立連結串列逆序輸出):

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef struct LNode{
    char data; //資料域
    struct LNode *next; //指標域
}LNode,*LinkList; //*LinkList為LNode型別
void Reverse(LinkList &L,int n)
{
    L = new LNode; //生成頭結點,用頭指標L指向它
    L->next = NULL;
    //下面for迴圈是使用頭插法建立單鏈表
    for(int i=0;i<n;i++)
    {
        LinkList p;
        p = new LNode; //生成新結點
        cin>>p->data; //輸入元素值
        p->next = L->next; //和下面一句一起插入到表頭
        L->next = p;
    }
    //下面這個while迴圈的作用是輸出單鏈表中結點的值
    while(L->next)
    {
        cout<<L->next->data<<" ";
        L->next = L->next->next;
    }
}
int main()
{
    LinkList List;
    Reverse(List,5);
    return 0;
}

執行結果:

單鏈表的頭插法(前插法)圖示:

 核心程式碼四句:

        p = new LNode; //生成新結點
        cin>>p->data; //輸入資料值
        p->next = NULL; //和下面一句一起實現插入到表尾的操作
        r->next = p;
        r = p; //r指向新的尾結點

完整程式碼的實現(輸入五個值,尾插法建立連結串列順序輸出):

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef struct LNode{
    char data; //資料域
    struct LNode *next; //指標域
}LNode,*LinkList; //*LinkList為LNode型別
LinkList r,p;
void print(LinkList &L,int n)
{
    L = new LNode;
    L->next=NULL;
    r = L; //尾指標r指向頭結點
    //下面for迴圈是使用尾插法建立單鏈表
    for(int i=0;i<n;i++)
    {
        p = new LNode; //生成新結點
        cin>>p->data; //輸入資料值
        p->next = NULL; //和下面一句一起實現插入到表尾的操作
        r->next = p;
        r = p; //r指向新的尾結點
    }
    //下面這個while迴圈的作用是輸出單鏈表中結點的值
    while(L->next)
    {
        cout<<L->next->data<<' ';
        L->next = L->next->next;
    }
}
int main()
{
    LinkList lis;
    print(lis,5);
    return 0;
}

執行結果: