用指標處理鍊錶

2021-07-24 12:55:08 字數 3069 閱讀 3633

鍊錶概述

鍊錶是一種常見的重要的資料結構。它是動態地進行儲存分配的一種結構。

鍊錶有乙個 頭指標 變數,它存放乙個位址,該位址指向乙個元素,鍊錶中每乙個元素稱為 結點,每個結點都應包括兩個部分,一為使用者需要用的實際資料,二為下乙個結點的位址。可以看出,頭指標 head 指向第乙個元素,第乙個元素又指向第二個元素,。。。。直到最後乙個元素,該元素不再指向其他元素,它稱為 表尾,它的位址部分放乙個 null(表示 空位址)鍊錶到此結束。

前面介紹了結構體變數,用它作煉表中的結點是最合適的,乙個結構體變數包含若干成員,這些成員可以是數值型別,字元型別,陣列型別,也可以是指標型別,我們用這個指標型別成員來存放下乙個結點的位址。例如可以設計這樣乙個結構體型別:

struct student

;

其中成員 num 和 score 用來存放結點中的有用資料(使用者需要用到的資料),next 是指標型別成員,它指向 struct student 型別資料(這是 next 所在結構體型別)。乙個指標型別的成員既可以指向其他型別的結構體資料,也可以指向自己所在的結構體型別的資料。現在 next 是 struct student 型別中的乙個成員,它又指向 struct student 型別的資料。用這種方法就可以建立鍊錶。

請注意:只是定義乙個 struct student 型別,並未實際分配儲存空間,只有定義了變數才分配記憶體單元。

簡單鍊錶

下面通過乙個例子來說明如何建立和輸出乙個簡單鍊錶

#include 

#include

#define null 0

struct student

;void main()

while(p != null);//輸出完 c 結點後 p 的值為 null

system("pause");

}

執行結果

99101 89.5

99103 90.0

99107 85.0

處理動態鍊錶所需的函式

(1)malloc 函式

void *malloc(unsigned int size);

作用是在記憶體的動態儲存區中分配乙個長度為 size 的連線空間。些函式的值(即返回值)是乙個指向分配空間起始位址的指標(基型別為 void)。如果些函式未能成功地執行(例如記憶體空間不足)則返回空指標 null。

(2)calloc 函式

void *calloc(unsigned n, unsigned size);

其作用是在記憶體的動態區儲存中分配 n 個長度為 size 的連續空間。函式返回乙個指向分配空間起始位址的指標,如果分配不成功,返回 null。

用 calloc 函式可以為一維陣列開闢動態儲存空間, n 為陣列元素個數,每個元素長度為 size。  

(3)free 函式

void free(void *p);

其作用是釋放由 p 指向的記憶體區,使這部分記憶體區能被其它變數使用, p 是最後一次呼叫 calloc 或 malloc 函式時返回的值。free 函式無返回值。

請注意:以前的c版本提供的 malloc 和 calloc 函式得到的是指向字元型資料的指標。ansi c 提供的 malloc 和 calloc 函式規定為 void * 型別。

建立動態鍊錶

所謂建立動態鍊錶是指在程式執行過程中從無到有地建立起乙個鍵表,即乙個乙個地開闢結點和輸入各結點資料,並建立起前後相鏈的關係。

#include 

#include

#define null 0

#define len sizeof(struct student)

struct student

;struct student *create()

p2->next = null;

return head;

}void printlist(struct student *head)

while(p != null);

}}void main()

以下是對鍊錶的各種操作

列印鍊錶

void printlist(struct student *head)

while (p != null);

}/* while(p -> next != null)

*/}

刪除節點

struct student *delnode(struct student *head, int num)

else

if(p1->num == num)

else

printf("can not find list num.\n");

} return head;

}

更新節點

struct student *update(struct student *head, int

index, int num, float score)

else

if(p->num == index)

else

printf("can not find list index.\n");

} return head;

}

增加節點

struct student *add(struct student *head, int

index, int num, float score)

else

if(p1->num == index)

else

}else

printf("can not find list index.\n");

} return head;

}

(未完)

用指標處理鍊錶

用指標處理鍊錶 建立乙個簡單的鍊錶,它由3個學生資料的結點組成,要求輸出各結點中的資料 include struct student int main while p null 輸出完c結點後p的值為null,迴圈終止 return 0 寫一函式建立乙個有3名學生資料的單向動態鍊錶 include ...

用指標處理鍊錶

鍊錶是一種常見的重要資料結構。它是動態地進行儲蓄分類的一種結構。鍊錶有一系列節點構成,節點在執行時動態生成,每個節點包括資料域,資料域儲存當前節點的資訊,指標域儲存下乙個節點的手位址。記憶體隨著時間的增加會找不到大塊的順序空間 陣列的大小只能是固定的,增加或刪除都會移動大量資料 鏈式儲存大小可以伸縮...

C語言 關於用指標處理鍊錶

指標 指標的定義 型別名 指標變數名 如 int p 定義的同時進行初始化 int p a 指針對陣列的引用 int a 5 int p p a 0 表示把a 0 的位址賦值給指標p 或者寫 p a 表示把陣列a首元素的位址 即a 0 陣列指標的運算 p 與 p 是不同的 p 是先取 p 的值,然後...