1. 程式人生 > >徹底理解連結串列中為何使用二級指標或者一級指標的引用

徹底理解連結串列中為何使用二級指標或者一級指標的引用

轉載:https://blog.csdn.net/u012234115/article/details/39717215

在用c/c++寫資料結構程式時,連結串列和二叉樹中經常需要用到二級指標或者一級指標的引用,那麼什麼時候用什麼時候不用呢?

先看一個簡單的c++連結串列操作程式:

(雖然風格有點像c,不過這個是cpp檔案,不要在意這些細節)

  1. /* 
  2. code:Linklist 
  3. author:tashaxing 
  4. time:2014.9.30 
  5. */
  6. #include "stdio.h"        
  7. #include "stdlib.h"   
  8. #include "time.h"
  9. #define OK 1
  10. #define ERROR 0
  11. #define TRUE 1
  12. #define FALSE 0
  13. #define MAXSIZE 20 /* 儲存空間初始分配量 */
  14. typedefint Status;/* Status是函式的型別,其值是函式結果狀態程式碼,如OK等 */
  15. typedefint ElemType;/* ElemType型別根據實際情況而定,這裡假設為int */
  16. Status visit(ElemType c)  
  17. {  
  18.     printf("%d ",c);  
  19.     return OK;  
  20. }  
  21. typedefstruct Node  
  22. {  
  23.     ElemType data;  
  24.     struct Node *next;  
  25. }Node;  
  26. typedef
    struct Node *LinkList; /* 定義LinkList */
  27. //初始化表頭,用一級指標(此方式無效)
  28. Status InitList1(LinkList L)    //等價於Node *L
  29. {   
  30.     L=(LinkList)malloc(sizeof(Node)); /* 產生頭結點,並使L指向此頭結點 */
  31.     if(!L) /* 儲存分配失敗 */
  32.             return ERROR;  
  33.     L->next=NULL; /* 指標域為空 */
  34.     return OK;  
  35. }  
  36. //初始化表頭,用二級指標
  37. Status InitList2(LinkList *L)   //等價於Node **L
  38. {   
  39.     *L=(LinkList)malloc(sizeof(Node)); /* 產生頭結點,並使L指向此頭結點 */
  40.     if(!(*L)) /* 儲存分配失敗 */
  41.             return ERROR;  
  42.     (*L)->next=NULL; /* 指標域為空 */
  43.     return OK;  
  44. }  
  45. //初始化表頭,用一級指標引用
  46. Status InitList3(LinkList &L)   //等價於Node *&L
  47. {   
  48.     L=(LinkList)malloc(sizeof(Node)); /* 產生頭結點,並使L指向此頭結點 */
  49.     if(!L) /* 儲存分配失敗 */
  50.             return ERROR;  
  51.     L->next=NULL; /* 指標域為空 */
  52.     return OK;  
  53. }  
  54. //清空連結串列,使用二級指標
  55. Status ClearList1(LinkList *L)  
  56. {   
  57.     LinkList p,q;  
  58.     p=(*L)->next;           /*  p指向第一個結點 */
  59.     while(p)                /*  沒到表尾 */
  60.     {  
  61.         q=p->next;  
  62.         free(p);  
  63.         p=q;  
  64.     }  
  65.     (*L)->next=NULL;        /* 頭結點指標域為空 */
  66.     return OK;  
  67. }  
  68. //清空連結串列,使用一級指標
  69. Status ClearList2(LinkList L)  
  70. {   
  71.     LinkList p,q;  
  72.     p=L->next;           /*  p指向第一個結點 */
  73.     while(p)                /*  沒到表尾 */
  74.     {  
  75.         q=p->next;  
  76.         free(p);  
  77.         p=q;  
  78.     }  
  79.     L->next=NULL;        /* 頭結點指標域為空 */
  80.     return OK;  
  81. }  
  82. //銷燬連結串列,使用一級指標(此方式無效)
  83. Status DestroyList1(LinkList L)  
  84. {  
  85.     LinkList p,q;  
  86.     p=L->next;           /*  p指向第一個結點 */
  87.     while(p)                /*  沒到表尾 */
  88.     {  
  89.         q=p->next;  
  90.         free(p);  
  91.         p=q;  
  92.     }  
  93.     free(L);  
  94.     L=NULL;  
  95.     return OK;  
  96. }  
  97. //銷燬連結串列,使用二級指標
  98. Status DestroyList2(LinkList *L)  
  99. {  
  100.     LinkList p,q;  
  101.     p=(*L)->next;           /*  p指向第一個結點 */
  102.     while(p)                /*  沒到表尾 */
  103.     {  
  104.         q=p->next;  
  105.         free(p);  
  106.         p=q;  
  107.     }  
  108.     free(*L);  
  109.     *L=NULL;  
  110.     return OK;  
  111. }  
  112. //銷燬連結串列,使用一級指標引用
  113. Status DestroyList3(LinkList &L)  
  114. {  
  115.     LinkList p,q;  
  116.     p=L->next;           /*  p指向第一個結點 */
  117.     while(p)                /*  沒到表尾 */
  118.     {  
  119.         q=p->next;  
  120.         free(p);  
  121.         p=q;  
  122.     }  
  123.     free(L);  
  124.     L=NULL;  
  125.     return OK;  
  126. }  
  127. /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */
  128. /* 操作結果:用e返回L中第i個數據元素的值 */
  129. Status GetElem(LinkList L,int i,ElemType *e)  
  130. {  
  131.     int j;  
  132.     LinkList p;     /* 宣告一結點p */
  133.     p = L->next;     /* 讓p指向連結串列L的第一個結點 */
  134.     j = 1;      /*  j為計數器 */
  135.     while (p && j<i)  /* p不為空或者計數器j還沒有等於i時,迴圈繼續 */
  136.     {     
  137.         p = p->next;  /* 讓p指向下一個結點 */
  138.         ++j;  
  139.     }  
  140.     if ( !p || j>i )   
  141.         return ERROR;  /*  第i個元素不存在 */
  142.     *e = p->data;   /*  取第i個元素的資料 */
  143.     return OK;  
  144. }  
  145. //在中間插入元素,用二級指標
  146. Status ListInsert1(LinkList *L,int i,ElemType e)  
  147. {   
  148.     int j;  
  149.     LinkList p,s;  
  150.     p = *L;     
  151.     j = 1;  
  152.     while (p && j < i)     /* 尋找第i個結點 */
  153.     {  
  154.         p = p->next;  
  155. 相關推薦

    徹底理解連結串列為何使用二級指標或者一級指標引用

    轉載:https://blog.csdn.net/u012234115/article/details/39717215在用c/c++寫資料結構程式時,連結串列和二叉樹中經常需要用到二級指標或者一級指標的引用,那麼什麼時候用什麼時候不用呢?先看一個簡單的c++連結串列操作程式

    連結串列的頭和尾節點/指標的常規用法(來自:演算法:C語言實現)

    下面是基本連結串列處理操作的5種常規用法的實現.這類程式碼用於內嵌連結串列處理程式碼的簡單應用中 迴圈,永遠非空 頭插入 head->next = head; 在x節點後插入t節點 t->next = x->next, x->next = t; 刪

    連結串列一級指標二級指標

    在用c/c++寫資料結構程式時,連結串列和二叉樹中經常需要用到二級指標或者一級指標的引用,那麼什麼時候用什麼時候不用呢?先看一個簡單的c++連結串列操作程式:(雖然風格有點像c,不過這個是cpp檔案,不要在意這些細節)/* code:Linklist author:tasha

    關於連結串列指標和頭結點的理解

    線性表使用順序(陣列)儲存時有個弊端,那就是在插入和刪除時需要大量的移動資料,這顯示是非常消耗時間的,所以可以採用鏈式儲存,即有一個指標域(單鏈表),來記錄下個結點的儲存位置(地址),這樣在插入和刪除結點時只需要修改指標域即可,從而大量減少移動資料所消耗的時間。來看連結串列

    關於如何理解連結串列結構體指標引用LinkNode * &L的問題

    初學資料結構,在學習的過程中有了這個疑問,已經理解其中緣由,特寫篇部落格和大家一起分享交流。 C++中的引用:& int a=10; int &ra=a; 注意:此處&是識別符號,不是取地址符! a是目標原名稱,ra是引用名,由引用的作用“引用就是某

    在一個排序的連結串列,存在重複的結點,請刪除該連結串列重複的結點,重複的結點不保留,返回連結串列指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5

    題目描述 在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5 /* 思路:由於是排序連結串列,只需判斷

    快慢指標連結串列的一些證明

    目錄 一、一定會相遇的證明 二、環長度 三、連線點 四、帶環連結串列總長度 五、例題 一、一定會相遇的證明 1、如果連結串列沒有環,那麼快指標比慢指標先到達尾部(null)。 2、如果連結串列有環的話,因為快指標走的比慢指標快,所以在環中相遇的過程可以看作是快

    結構體和連結串列陣列和指標不同表達形式

    int getMaxLengthOfItems(MEC_MENU *menu,int count){     int i;     int maxLen = strlen(menu[0].item);     for(i = 0; i < c

    連結串列指標

    中期答辯改在了國慶之後,終於有時間可以看看劍指offer了。在看到單向連結串列的部分,對指標,尤其是頭指標有點疑惑。首先容易理解的是連結串列的節點是一個結構體,該結構體包含一個數據(一般是int型),還包含一個指向該結構體型別的指標。通過指標的指向一個個遍歷,也是通過指標一次

    連結串列指標,地址——資料結構(Summary)

    資料結構中跳過集合,直接開始線性結構 線性結構中單鏈表的操作涉及到給一個變數賦值地址,所以涉及到了指標 通過指標裡的地址很方便找到節點 但指標這裡繞了我很長時間,不論學了多少遍也不敢說把指標學會了 地

    C++ 單鏈表基本操作分析與實現 連結串列   連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結

    連結串列   連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表

    11. 微軟面試題:輸入一個單向連結串列,輸出該連結串列倒數第k個結點。連結串列的倒數第0個結點為連結串列的尾指標

    題目:輸入一個單向連結串列,輸出該連結串列中倒數第k個結點。連結串列的倒數第0個結點為連結串列的尾指標。 分析: 單鏈表只能向後遍歷,不能向前遍歷,尾指標好找,倒數第K個不能從尾指標向前找。 倒的不好找,正的好找,我們只需要知道連結串列的總長度,就可以知道正數第幾個節點(

    劍指offer——在一個排序的連結串列,存在重複的結點,請刪除該連結串列重複的結點, # 重複的結點不保留,返回連結串列指標

    # 在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點, # 重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5 # -*- coding:u

    連結串列 指向 節點(結構體)指標指標(二重指標)(原題目為pta上查詢倒數k個位置上的數字)

    #include<stdio.h> #include<stdlib.h> typedef struct list{ int num; struct list *next; }List ,*LIST; LIST createlist(LIST *L,

    劍指Offer Java版 雙指標連結串列的應用

           所謂雙指標,指的是在遍歷物件的過程中,不是使用單個指標進行訪問,而是使用兩個相同方向或者相反方向的指標進行遍歷,從而達到相應的目的。雙指標的使用可以降低程式的時間複雜度或者空間複雜度,總之是一種有效的解決問題的方案。        (注:這裡所說的指標,並不是

    雅虎面試題─有兩個雙向迴圈連結串列A,B,知道其頭指標為:pHeadA,pHeadB,請寫一函式將兩連結串列data值相同的結點刪除

    有雙向迴圈連結串列結點定義為: struct node {    int data;   struct node *front,*next; }; 有兩個雙向迴圈連結串列A,B,知道其頭指標為:pHeadA,pHeadB,請寫一函式將兩連結串列中data值相同的結點刪

    設計一個演算法,刪除遞增有序連結串列值大於mink且小於maxk的所有元素(mink和maxk是給定的兩個引數,其值可以和表的元素相同,也可以不同)。

    語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

    設計一個演算法,將連結串列所有結點的連結串列方向“原地”逆轉,即要求僅利用原表的儲存空間,換句話說,要求演算法的空間複雜度為O(1)。

    語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

    已知兩個連結串列A和B分別表示兩個集合,其元素遞增排列。請設計一個演算法,用於求出A與B的交集,並存放在A連結串列

    語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li