日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双链表实现

發布時間:2023/12/13 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双链表实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以前寫的不帶頭的單鏈表實現,當時也啥也沒學,好多東西不知道,加上一心想壓縮代碼,減少情況,所以寫得不太好。

請教了老師,首先是命名問題和代碼緊湊性等的改進。還有可讀性方面的改進,多寫了一些注釋。并且因為帶頭的比較好寫,好操作,所以標準寫法也不是很長,繁瑣。

?

?

下面貼代碼

#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); }

?

總結

以上是生活随笔為你收集整理的双链表实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。