首頁  >  文章  >  如何理解c語言鍊錶

如何理解c語言鍊錶

清浅
清浅原創
2019-03-06 10:31:0519388瀏覽

C語言鍊錶就是一種資料結構,可以在裡面動態的進行儲存分配還可以定義節點資料類型,以及實現對節點的增刪改查等。

鍊錶是一種常見的基礎資料結構,結構體指標在這裡得到了充分的利用。鍊錶可以動態的進行儲存分配,也就是說,鍊錶是一個功能極為強大的數組,它可以在節點中定義多種資料類型,還可以根據需要隨意增添,刪除,插入節點。接下來將在文章中為大家具體介紹C語言中的鍊錶,希望對大家有幫助。

如何理解c語言鍊錶

【推薦課程:C語言教學

#鍊錶都有一個頭指針,一般以head來表示,存放的是一個位址。鍊錶中的節點分為兩類,頭結點和一般節點,頭結點是沒有資料域的。鍊錶中每個節點都分為兩個部分,一個資料域,一個是指標域。鍊錶就像車鍊子一樣,head指向第一個元素:第一個元素又指向第二個元素;…,直到最後一個元素,該元素不再指向其它元素,它稱為“錶尾”,它的位址部分存放了一個“NULL”(表示“空位址”),鍊錶到此結束。作為有強大功能的鍊錶,對它的操作當然有許多,例如:鍊錶的創建,修改,刪除,插入,輸出,排序,反序,清空鍊錶的元素,求鍊錶的長度等等。初學鍊錶,一般從單向鍊錶開始

空鍊錶

--->NULL
head

有n個節點的鍊錶

 ---->[p1]---->[p2]...---->[pn]---->[NULL]
head   p1->next  p2->next   pn->next

建立鍊錶

一般建立鍊錶我們都用typedef  struct,因為這樣定義結構變數時,我們就可以直接可以用LinkList  *a;定義結構體類型變數了。

typedef struct student{
int score;
struct student *next;
} LinkList;

初始化一個鍊錶,n為鍊錶節點個數

#
LinkList *creat(int n){
LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
head = (LinkList*)malloc(sizeof(LinkList));//分配地址
end = head;         //若是空链表则头尾节点一样
for (int i = 0; i < n; i++) {
node = (LinkList*)malloc(sizeof(LinkList));
scanf("%d", &node->score);
end->next = node;
end = node;
}
end->next = NULL;//结束创建
return head;
}

修改鍊錶節點值

##修改鍊錶節點值很簡單。下面是一個傳入鍊錶和要修改的節點,來修改值的函數。

void change(LinkList *list,int n) {//n为第n个节点
LinkList *t = list;
int i = 0;
while (i < n && t != NULL) {
t = t->next;
i++;
}
if (t != NULL) {
puts("输入要修改的值");
scanf("%d", &t->score);
}
else {
puts("节点不存在");
}
}

刪除鍊錶節點

刪除鍊錶的元素也就是把前節點的指標域越過要刪除的節點指向下個節點。即:p->next = q->next;然後放出q節點的空間,即free(q);

如何理解c語言鍊錶

void delet(LinkList *list, int n) {
	LinkList *t = list, *in;
	int i = 0;
	while (i < n && t != NULL) {
		in = t;
		t = t->next;
		i++;
	}
	if (t != NULL) {
		in->next = t->next;
		free(t);
	}
	else {
		puts("节点不存在");
	}
}

插入鍊錶節點

如何理解c語言鍊錶

我們可以看出來,插入節點就是用插入前節點的指標域連結上插入節點的資料域,再把插入節點的指標域連結上插入後節點的資料域。根據圖,插入節點也就是:e->next = head->next;  head->next = e;

增加鍊錶節點用到了兩個結構體指標和一個int資料。

void insert(LinkList *list, int n) {
	LinkList *t = list, *in;
	int i = 0;
	while (i < n && t != NULL) {
		t = t->next;
		i++;
	}
	if (t != NULL) {
		in = (LinkList*)malloc(sizeof(LinkList));
		puts("输入要插入的值");
		scanf("%d", &in->score);
		in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下一个节点
		t->next = in;//填充t节点的指针域,把t的指针域重新指向in
	}
	else {
		puts("节点不存在");
	}
}

輸出鍊錶

輸出鍊錶很簡單,邊遍歷邊輸出就行了

        while (h->next != NULL) {
		h = h->next;
		printf("%d  ", h->score);
	}

總結:以上就是這篇文章的全部內容了,希望對大家有幫助。

以上是如何理解c語言鍊錶的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn