1. 程式人生 > >連結串列中的一級指標與二級指標

連結串列中的一級指標與二級指標

在用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. typedefstruct 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. 相關推薦

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

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

    C語言之一級指標二級指標剖析

    什麼是指標?        在電腦科學中,指標(Pointer)是程式語言中的一個物件,利用地址,  它的值直接指向(points to)存在電腦儲存器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。因此,將地址形象化的稱為“指標”。意思是

    指標二級指標筆記(C語言)

    一級指標 存放地址的變數稱為指標變數,指標變數是一種特殊的變數。 一般變數存放的是資料本身,指標變數存放的是資料的地址。 int a = 1 ; //普通變數 int *p = NULL ; //一個指向空的int型別的指標變數 p = &a;

    連結串列LinkList LLinkList *L的區別

    typedef struct Node{ int elem; struct node * next; }node,*LinkList; 對於LinkList L: L是指向定義的node結構體的指標,可以用->運算子來訪問結構體成員,即L->ele

    徹底理解指標二級指標

    1.啥 ! int 可以強轉為 int*  ! 都是二進位制有啥不能轉? 編譯器才不管呢,你說這

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

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

    c語言的一級指標二級指標作為函式引數,連結串列,malloc的分配等等總結

    主要內容: 1、一級指標和二級指標 2、函式指標傳遞的例子 3、什麼時候需要傳遞二級指標? 4、二級指標在連結串列中的使用 1、一級指標和二級指標 一級指標:即我們一般說的指標,就是記憶體地址; 二級指標:指向指標的指標,就是地址的地址; 如: int a=

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

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

    C語言:結構體一級指標二級指標的建立釋放示例

    這幾天把C語言鞏固了一下,作為一門最基本的程式語言,C語言還是相當基礎和非常重要的,個人認為C語言還是很有必要學好吃透的。 今天寫的話題是結構體結構體中一級指標和二級指標的建立與釋放,以一個例子來說明,筆者這裡自己敲得程式碼,雖然用C語言幾年了,但是有的東西還是會遺忘。筆者

    在一個排序的連結串列,存在重複的結點,請刪除該連結串列重複的結點,重複的結點不保留,返回連結串列指標。 例如,連結串列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語言中沒有字串型別,通過字元陣列來模擬字串,字串以‘\0’結束。 一、一級指標: 字元陣列的定義: 1.指定長度:char buf[100]={‘a’,‘b’}; 或char buf[100]=“ab”; 如果初始化的字元個數大於陣列長度,將會出現編譯錯

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

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

    使用雙重指標實現連結串列結點的插入刪除

    單鏈表結點的插入和刪除是資料結構中很基本的操作。如果單鏈錶帶有頭結點,那麼可以把頭結點指標傳遞給插入和刪除函式;可如果對無頭結點的單鏈表進行上述操作,僅傳遞頭指標(指向第一個結點的指標),在插入或刪除操作改變連結串列頭指標時,將會有些問題。 下面我們通過一個例

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

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

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

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