如何理解C语言链表,如何理解c语言链表
C語言鏈表就是一種數(shù)據(jù)結(jié)構(gòu),可以在上面動(dòng)態(tài)的進(jìn)行傳輸分配還可以定義節(jié)點(diǎn)數(shù)據(jù)類別或者實(shí)現(xiàn)對節(jié)點(diǎn)的增刪改查等
鏈表是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),結(jié)構(gòu)體指針在這里得到了充分的借助。鏈表可以動(dòng)態(tài)的進(jìn)行傳輸分配,也就是說,鏈表是一個(gè)功能極為強(qiáng)大的變量,它可以在結(jié)點(diǎn)中定義多種數(shù)據(jù)類別,還可以按照需要輕易增添,刪除,插入節(jié)點(diǎn)。接下來將在文章中為你們具體介紹C語言中的鏈表,希望對你們有所幫助
【推薦課程:C語言教程】
鏈表都有一個(gè)頭指針,一般以head來表示,存放的是一個(gè)地址。鏈表中的節(jié)點(diǎn)分為兩類,頭結(jié)點(diǎn)和通常節(jié)點(diǎn),頭結(jié)點(diǎn)是沒有數(shù)據(jù)域的。鏈表中每個(gè)結(jié)點(diǎn)都分為兩部份,一個(gè)數(shù)據(jù)域,一個(gè)是指針域。鏈表就好似車鏈子一樣,head指向第一個(gè)元素:第一個(gè)元素既指向第二個(gè)元素;……,直到最后一個(gè)元素,該元素不再指向其他元素,它稱為“表尾”,它的地址部分存放了一個(gè)“NULL”(表示“空地址”),鏈表到此結(jié)束。作為有強(qiáng)大功能的鏈表,對它的操作顯然有許多,比如:鏈表的創(chuàng)建,修改,刪除,插入,輸出,排序,反序,清空鏈表的元素,求鏈表的長度等等。初學(xué)鏈表,一般從單向鏈表開始
空鏈表
--->NULL
head
有n個(gè)結(jié)點(diǎn)的數(shù)組
---->[p1]---->[p2]...---->[pn]---->[NULL]
head p1->next p2->next pn->next
創(chuàng)建鏈表
一般創(chuàng)建泛型我們都用typedef struct,因?yàn)檫@樣定義結(jié)構(gòu)體變量時(shí),我們就可以直接可以用LinkList *a;定義結(jié)構(gòu)體類型變量了。
typedef struct student{
int score;
struct student *next;
} LinkList;
初始化一個(gè)鏈表,n為數(shù)組節(jié)點(diǎn)個(gè)數(shù)
LinkList *creat(int n){
LinkList *head, *node, *end;//定義頭節(jié)點(diǎn),普通節(jié)點(diǎn),尾部節(jié)點(diǎn);
head = (LinkList*)malloc(sizeof(LinkList));//分配地址
end = head; //若是空鏈表則頭尾節(jié)點(diǎn)一樣
for (int i = 0; i < n; i++) {
node = (LinkList*)malloc(sizeof(LinkList));
scanf("%d", &node->score);
end->next = node;
end = node;
}
end->next = NULL;//結(jié)束創(chuàng)建
return head;
}
修改鏈表節(jié)點(diǎn)值
修改鏈表節(jié)點(diǎn)值很簡單。下面是一個(gè)傳入鏈表和要更改的結(jié)點(diǎn)c ++鏈表,來設(shè)置值的函數(shù)。
void change(LinkList *list,int n) {//n為第n個(gè)節(jié)點(diǎ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("節(jié)點(diǎn)不存在");
}
}
刪除鏈表節(jié)點(diǎn)
刪除鏈表的元素也就是把前節(jié)點(diǎn)的指針域跨過要?jiǎng)h除的結(jié)點(diǎn)指向下下個(gè)節(jié)點(diǎn)。即:p->next = q->next;然后放出q節(jié)點(diǎn)的空間,即free(q);
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("節(jié)點(diǎn)不存在");
}
}
插入鏈表節(jié)點(diǎn)
我們可以看起來,插入節(jié)點(diǎn)就是用插入前節(jié)點(diǎn)的指針域鏈接上插入節(jié)點(diǎn)的數(shù)據(jù)域c ++鏈表,再把插入節(jié)點(diǎn)的指針域鏈接上插入后節(jié)點(diǎn)的數(shù)據(jù)域。根據(jù)圖,插入節(jié)點(diǎn)也就是:e->next = head->next; head->next = e;
增加遞歸節(jié)點(diǎn)用到了兩個(gè)結(jié)構(gòu)體指針跟一個(gè)int數(shù)據(jù)。
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節(jié)點(diǎn)的指針域,也就是說把in的指針域指向t的下一個(gè)節(jié)點(diǎn)
t->next = in;//填充t節(jié)點(diǎn)的指針域,把t的指針域重新指向in
}
else {
puts("節(jié)點(diǎn)不存在");
}
}
輸出鏈表
輸出數(shù)組很簡單,邊遍歷邊輸出就行了
while (h->next != NULL) {
h = h->next;
printf("%d ", h->score);
}
總結(jié):以上就是本篇文章的全部內(nèi)容了,希望對你們有所幫助。
總結(jié)
以上是生活随笔為你收集整理的如何理解C语言链表,如何理解c语言链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VBA发送email
- 下一篇: Mathematical-morphol