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