前幾天寫了乙個單向鍊錶,今天參考自己單向鍊錶改寫了乙個雙向非迴圈鍊錶,下面只討論雙向非迴圈鍊錶。
雙向非迴圈鍊錶有如下特點:
一、雙向鍊錶每個結點都有乙個前驅指標和後驅指標(當然頭結點和尾結點除外)。
二、雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。
三、頭結點只有後驅指標沒有前驅指標,尾結點後驅指標指向null。
一、初始化資料結構
/*定義雙向鍊錶結構*/
typedef struct _double_link_node
double_link_node;
二、建立乙個頭結點
/*建立乙個雙向鍊錶,返回乙個空結點*/
double_link_node *create_double_link()
new->data = 0;
new->prev = null;
new->next = null;
return new;
}
三、向雙向鍊錶中插入乙個節點(順序插入)
/*插入結點*/
int insert_note(double_link_node *head, int value)
new->data = value;
while((current->next != null) && (value > current->next->data))
if(current->next == null) /*為空或者查詢到最後插入*/
else
}else
return 0;
}
四、刪除節點(順序查詢到後刪除)
/*刪除節點*/
int delete_note(double_link_node *head, int valude)
if(current == null) //等於null有兩種情況:(1)查詢到最後、(2)節點為空
else
return -1;
} else
else if(current->next == null) //最後乙個節點
else //中間刪除
free(current);
printf("delete node success!\n"); }
return 0;
}
五、查詢節點
/*查詢指定節點*/
int search_link(double_link_node *head, int key)
if(current == null) //鍊錶為空或者沒有查詢到
else
return -1;
}else
return 0;
}
六、測定結點個數
/*測鍊錶長度*/
int length_link(double_link_node *head)
return count;
}
七、釋放鍊錶
/*釋放鍊錶*/
void free_link(double_link_node *head)
free(head);
printf("free link success!");
exit(0);
}
八、遍歷輸出鍊錶(有反向輸出,檢查前驅指標是否連線好)
/*列印鍊錶*/
void print_link(double_link_node *head)
printf("\n");
}void print_link(double_link_node *head)
while(current != head->next)
printf("%d<==>", current->data);
}printf("\n");
}
呼叫介面沒有給出,可以自己寫。。也可以參考我上次寫的單向鍊錶介面。
資料結構 鍊錶 雙向鍊錶
注意typedef的定義結構,以及dinklist的資料型別 typedef struct dnode dnode,dinklist 注意插入第乙個結點時,prior指標的空指向問題 if l next null 若l後繼結點為空 則省略該步驟 l next prior p 基本 頭插法建立雙向鍊錶...
資料結構 雙向鍊錶
單鏈表的單向性 只能從頭結點開始高效訪問鍊錶中的資料元素。單鏈表還存在另乙個缺陷 逆序訪問時候的效率極低。如下 linklistlist for int i 0 i 5 i for int i list.length 1 i 0 i 根據大o推算法可以得出乙個for迴圈的時間複雜度為o n get ...
資料結構 雙向鍊錶
帶頭節點的雙向鍊錶 dlinklist.h pragma once include include include typedef int dlinktype typedef struct dlinknode dlinknode void dlinklistinit dlinknode head 初...