鏈表是一種經常使用的數據結構,每一個節點經過鏈或者指針連接在一塊兒,程序經過間接指針訪問鏈表中的節點。數據結構
typedef struct Node { //指向下一個節點的指針 struct Node *next; int value; }
單鏈表只能夠單向遍歷優化
單鏈表中插入:初版指針
#include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 typedef struct Node { struct Node *next; int value; } LinkList; //假設鏈表從小到大排序 int linkInsert(LinkList * current, int value) { //保存前一個節點 LinkList *previous; LinkList *new; //循環到合適的位置 while (current-> value < value) { previous = current; current = current->next; } new = malloc(sizeof(LinkList)); if (new == NULL) { return FALSE; } new->value = value; new->next = current; previous->next = new; return TRUE; }
當插入值到表頭和表尾時,會出錯,須要加上對特殊狀況的判斷,將傳入的第一個參數由,指向鏈表頭部節點的指針改成,指向 指向鏈表頭部的指針的指針,這樣就能夠添加節點到鏈表的頭部。blog
添加特殊狀況處理的版本二:排序
#include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 typedef struct Node { struct Node *next; int value; } LinkList; // int linkInsert(LinkList **rootPtr, int value) { //保存前一個節點 LinkList *previous; LinkList *current; LinkList *new; current = *rootPtr; previous = NULL; //循環到達末尾和找到符合要求的節點 while (current != NULL && current-> value < value) { previous = current; current = current->next; } new = malloc(sizeof(LinkList)); if (new == NULL) { return FALSE; } new->value = value; new->next = current; //指向列表首頁 if(previous == NULL){ *rootPtr = new; }else{ previous -> next = new; } return TRUE; } int main() { LinkList third = {NULL, 4}; LinkList second = {&third, 2}; LinkList first = {&second, 1}; LinkList *head = &first; LinkList **rootPtr = &head; linkInsert(rootPtr, 0); LinkList *pre = NULL; LinkList *current = *rootPtr; while(current != NULL){ printf("%d\t", current -> value); pre = current; current = current -> next; } return 0; }
優化:io
版本二把一個節點插入到鏈表的起始位置當作一種特殊狀況處理,對於新節點須要修改的是根節點,對於其餘任何點,修改的是前一個節點的next字段,其實這個兩個修改是相同的,即修改指向當前節點的指針,因此當咱們移動到下一個節點時,須要保存的是指向下一個節點的next字段的指針,而不是保持指向下一個節點的指針class
#include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 typedef struct Node { struct Node *next; int value; } LinkList; // int linkInsert(LinkList **nextPtr, int value) { LinkList *current; LinkList *new; //nextPtr爲指向當前節點的next字段的指針 while ((current = *nextPtr) != NULL && value > current -> value) { nextPtr = ¤t -> next; } new = malloc(sizeof(LinkList)); if (new == NULL) { return FALSE; } new-> value = value; new-> next = current; //前一個節點指向最新的節點,即便是表頭也能夠正常處理 *nextPtr = new; return TRUE; } int main() { LinkList third = {NULL, 4}; LinkList second = {&third, 2}; LinkList first = {&second, 1}; //把head當作next字段,指向第一個節點 LinkList *head = &first; LinkList **nextPtr = &head; linkInsert(nextPtr, 3); LinkList *current = *nextPtr; while(current != NULL){ printf("%d\t", current -> value); current = current -> next; } return 0; }