她問我單鏈表的結點長什麼樣子,我告訴她是這樣的:
她說「你也太懶了吧,寫個**給我」。於是我寫了個定義:
//定義結點
typedef struct node node;
她看了看,似懂非懂,於是開始轉移話題,問我最喜歡什麼樣的單鏈表,我想了想,畫了出來:
我的內心獨白:「這是乙個叫做空鏈的東西,沒錯,我就是喜歡這種簡潔到極致的東西,head表示頭指標,陰影代表的是頭結點的資料域,它是不放任何資料的,null是空指標,意味著鏈結束了。」
她拉著我,要我再畫點別的樣子的單鏈表,我只好畫了個她喜歡的:
她一臉懵逼,嘟囔著:「這**是什麼鬼?」
我:「你猜」
她:「你猜我猜不猜你猜不猜我不猜」
我:「這是乙個插入操作,在結點node-1和結點node-2之間插入結點node-3,藍線上有個叉,直觀上那裡需要斷開,大寫的1,2代表了插入的步驟。」
她:「切,有本事把插入的程式甩上來」
於是我甩上來了:
// 定義三個指標
node * node_1;
node * node_2;
node * node_3;
// 分配記憶體
node_3=(node *) malloc(sizeof(node));
// 插入
node_3 ->next= node_2;
node_1->next= node_3;
她拿筆戳了戳我:「你逗我呢吧,這連個初始化都沒有?!」
我:「饒了小的我吧t_t」
她:「不行,把初始化一寫」
我:
void listinit(node **head)
她:「你初始化了人家就不管啦?不銷毀啦?你不知道動態申請的結點是沒法自動**的嗎?」
我:
void listdestory(node **head)
// 釋放頭指標
(*head)=null;
}
她:「不要偷懶,把銷毀過程跟我說說」
我:「中」
她:「還有還有,你是怎麼給你的單鏈表編號的?」
我:「你看你看」
她:「再見」
下面是程式及執行結果:
main.c:
#include #include #include #include "singlelinkedlist.h"
void main(void)
listprint(head);
listdestory(&head);
}
singlelinkedlist.h:
//定義節點
typedef struct node node;
void listinit(node **head)
void listdestory(node **head)
// 釋放頭指標
(*head)=null;
}int listinsert(node *head,int position,int value)
// 分配記憶體
newnode = (node *)malloc(sizeof(node));
//賦值
newnode->value=value;
//插入
newnode->next=temp->next;
temp->next=newnode;
return 1;
}void listprint(node *head)
}
執行結果:
單鏈表(合併單鏈表)
單鏈表遍歷 單鏈表遍歷是從單鏈表頭指標head開始訪問,沿著next指標所指示的方向依次訪問每乙個結點,且每個結點只能訪問依次,直到最後乙個結點為止。遍歷時注意,不要改變head指標的指向。因此一般設定另外的乙個指標變數如p,p從head開始依次訪問乙個結點,直到鍊錶結束,此時p null,完成依次...
單鏈表之排序單鏈表
package list public class sortedsinglylist extends singlylist 將values陣列中的所有物件按值大小插入 public sortedsinglylist t values 過載深拷貝,由單鏈表構建排序單鏈表 public sortedsi...
單鏈表 雙鏈表
實現乙個單鏈表,鍊錶初始為空,支援三種操作 1 向煉表頭插入乙個數 2 刪除第k個插入的數後面的數 3 在第k個插入的數後插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的...