徹底理解連結串列中為何使用二級指標或者一級指標的引用
轉載:https://blog.csdn.net/u012234115/article/details/39717215
在用c/c++寫資料結構程式時,連結串列和二叉樹中經常需要用到二級指標或者一級指標的引用,那麼什麼時候用什麼時候不用呢?
先看一個簡單的c++連結串列操作程式:(雖然風格有點像c,不過這個是cpp檔案,不要在意這些細節)
- /*
- code:Linklist
- author:tashaxing
- time:2014.9.30
- */
- #include "stdio.h"
- #include "stdlib.h"
- #include "time.h"
- #define OK 1
- #define ERROR 0
- #define TRUE 1
- #define FALSE 0
- #define MAXSIZE 20 /* 儲存空間初始分配量 */
- typedefint Status;/* Status是函式的型別,其值是函式結果狀態程式碼,如OK等 */
- typedefint ElemType;/* ElemType型別根據實際情況而定,這裡假設為int */
- Status visit(ElemType c)
- {
- printf("%d ",c);
- return OK;
- }
- typedefstruct Node
- {
- ElemType data;
- struct Node *next;
- }Node;
- typedef
- //初始化表頭,用一級指標(此方式無效)
- Status InitList1(LinkList L) //等價於Node *L
- {
- L=(LinkList)malloc(sizeof(Node)); /* 產生頭結點,並使L指向此頭結點 */
- if(!L) /* 儲存分配失敗 */
- return ERROR;
- L->next=NULL; /* 指標域為空 */
- return OK;
- }
- //初始化表頭,用二級指標
- Status InitList2(LinkList *L) //等價於Node **L
- {
- *L=(LinkList)malloc(sizeof(Node)); /* 產生頭結點,並使L指向此頭結點 */
- if(!(*L)) /* 儲存分配失敗 */
- return ERROR;
- (*L)->next=NULL; /* 指標域為空 */
- return OK;
- }
- //初始化表頭,用一級指標引用
- Status InitList3(LinkList &L) //等價於Node *&L
- {
- L=(LinkList)malloc(sizeof(Node)); /* 產生頭結點,並使L指向此頭結點 */
- if(!L) /* 儲存分配失敗 */
- return ERROR;
- L->next=NULL; /* 指標域為空 */
- return OK;
- }
- //清空連結串列,使用二級指標
- Status ClearList1(LinkList *L)
- {
- LinkList p,q;
- p=(*L)->next; /* p指向第一個結點 */
- while(p) /* 沒到表尾 */
- {
- q=p->next;
- free(p);
- p=q;
- }
- (*L)->next=NULL; /* 頭結點指標域為空 */
- return OK;
- }
- //清空連結串列,使用一級指標
- Status ClearList2(LinkList L)
- {
- LinkList p,q;
- p=L->next; /* p指向第一個結點 */
- while(p) /* 沒到表尾 */
- {
- q=p->next;
- free(p);
- p=q;
- }
- L->next=NULL; /* 頭結點指標域為空 */
- return OK;
- }
- //銷燬連結串列,使用一級指標(此方式無效)
- Status DestroyList1(LinkList L)
- {
- LinkList p,q;
- p=L->next; /* p指向第一個結點 */
- while(p) /* 沒到表尾 */
- {
- q=p->next;
- free(p);
- p=q;
- }
- free(L);
- L=NULL;
- return OK;
- }
- //銷燬連結串列,使用二級指標
- Status DestroyList2(LinkList *L)
- {
- LinkList p,q;
- p=(*L)->next; /* p指向第一個結點 */
- while(p) /* 沒到表尾 */
- {
- q=p->next;
- free(p);
- p=q;
- }
- free(*L);
- *L=NULL;
- return OK;
- }
- //銷燬連結串列,使用一級指標引用
- Status DestroyList3(LinkList &L)
- {
- LinkList p,q;
- p=L->next; /* p指向第一個結點 */
- while(p) /* 沒到表尾 */
- {
- q=p->next;
- free(p);
- p=q;
- }
- free(L);
- L=NULL;
- return OK;
- }
- /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */
- /* 操作結果:用e返回L中第i個數據元素的值 */
- Status GetElem(LinkList L,int i,ElemType *e)
- {
- int j;
- LinkList p; /* 宣告一結點p */
- p = L->next; /* 讓p指向連結串列L的第一個結點 */
- j = 1; /* j為計數器 */
- while (p && j<i) /* p不為空或者計數器j還沒有等於i時,迴圈繼續 */
- {
- p = p->next; /* 讓p指向下一個結點 */
- ++j;
- }
- if ( !p || j>i )
- return ERROR; /* 第i個元素不存在 */
- *e = p->data; /* 取第i個元素的資料 */
- return OK;
- }
- //在中間插入元素,用二級指標
- Status ListInsert1(LinkList *L,int i,ElemType e)
- {
- int j;
- LinkList p,s;
- p = *L;
- j = 1;
- while (p && j < i) /* 尋找第i個結點 */
- {
- p = p->next;
-
相關推薦
徹底理解連結串列中為何使用二級指標或者一級指標的引用
轉載: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++ 單鏈表基本操作分析與實現 連結串列 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結
連結串列 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表
在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solutio
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