双链表实现
以前寫的不帶頭的單鏈表實現,當時也啥也沒學,好多東西不知道,加上一心想壓縮代碼,減少情況,所以寫得不太好。
請教了老師,首先是命名問題和代碼緊湊性等的改進。還有可讀性方面的改進,多寫了一些注釋。并且因為帶頭的比較好寫,好操作,所以標準寫法也不是很長,繁瑣。
?
?
下面貼代碼
#include <stdio.h> #include <stdlib.h> #include <string.h>typedef struct node{int key;//數據struct node * prev;//前驅struct node * next;//后繼 }Node;初始化(帶頭)?
Node * list; //初始化,這里·我們list不再是NULL,而是指向了一個節點 //這個改進方便了很多操作,也不用借助二重指針把list和next統一表示了void init(Node * list)//初始化 {list = (Node *)malloc(sizeof(Node));list->next = NULL;list->prev = NULL; }查找(不用再判斷一下空不空)
Node * find(int key,Node * list) {Node * head = list->next;//從頭節點后面開始找while(head != NULL && head->key != key)//找到或空跳出head = head->next;return head; }打印
void printList(Node * list)//打印 {Node * temp = list->next;頭節點下一個開始while(temp != NULL){printf("%d ",temp->key);temp = temp->next;}printf("\n"); }刪除指定結點
void delete(Node * list)//刪除指定結點 {list->prev->next = list->next;前面后面指針改了,再free自己即可list->next->prev = list->prev;free(list); }配合一下刪除:
void deleteKey(int key,Node * list) {delete(find(key,list)); }頭插:
void insertHead(int key,Node * list)//頭插 {Node * newNode = (Node *)malloc(sizeof(Node));//初始化newNode->key = key;newNode->next = list->next;//賦值后繼if(list->next != NULL)//如果有后繼,賦值后繼的前指針為新結點list->next->prev = newNode;list->next = newNode;//改頭newNode->prev = list;//賦值新結點前指針 }按下標插入
單鏈表都寫了,我就不寫長度函數和判斷非法了,用的時候注意吧。
void insert(int key,Node * list,int index) {Node * head=list;//最后指到要插位置的前一個即可Node * newNode = (Node *)malloc(sizeof(Node));//初始化newNode->key = key;while(index--)head = head->next;newNode->next = head->next;//修改指針newNode->prev = head;head->next = newNode; }指定某值后插入不寫了,和這個修改指針邏輯一樣,再傳一個find配合一下就行了。
?
然后簡單測試
int main() {Node * list = NULL;init(list);insertHead(1,list);insertHead(2,list);insertHead(3,list);printList(list);deleteKey(2,list);printList(list);insert(10,list,0);printList(list); }?
總結
- 上一篇: UNIX(进程间通信):04---孤儿进
- 下一篇: 坦克大战