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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构-链表之单链表

發布時間:2023/12/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构-链表之单链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????單鏈表即每個節點都存在數據域和指針域(特殊節點除外),每個節點都一個直接前驅節點和直接后繼節點(頭節點無前驅,尾節點無后繼),簡單來說就是上一個節點的指針域中存放了下一個節點的地址,因此可以實現層層節點依次查找,時間復雜度為O(n),這也就是相對順序表而言的缺點,但是對于頻繁的插入和刪除節點卻是相對于順序表的優點,除了首次查詢為O(n)外,插入和刪除都是O(1);

? ? 由于順序表存儲單元和長度都是固定的所以可以直接定位到需要查找的元素查找時間復雜的為O(1),刪除和插入會導致其它單元的位置移動所以時間復雜度為O(n)。

接下來介紹下單鏈表中簡單的基本操作實現:

//聲明一個單鏈表結構體 typedef struct LNode {int data; //數據域,數據域的類型為泛型(ElementType)LNode *next; //指針域,指向下一個node的地址 }LNode,*LinkList; //聲明2個結構體別名(結構體別名和結構體指針別名),方便在外部直接通過別名定義該結構體類型的變量

頭插法創建單鏈表:

/* function:頭插法創建單鏈表即將節點依次插入到head節點之后 */ LinkList headInsertList(LinkList &L) {LNode *s;int x;L =(LinkList)malloc(sizeof(LNode)); //開辟一塊空間,創建頭節點L->next = NULL;//初始化空鏈表scanf_s("%d", &x);//控制臺首次輸入節點數據while (x != 9999) {s =(LinkList)malloc(sizeof(LNode));//創建一個新節點s->data = x;//指定新節點的數據域s->next = L->next;//指定新節點的指針域L->next = s;//頭節點指向新節點scanf_s("%d", &x);//控制臺依次輸入節點數據}return L; }

尾插法創建單鏈表:

/* 尾插法創建單鏈表即將節點依次插入到鏈表的尾部 */ LinkList endInsertList(LinkList &L) {LNode *s;//定義需要創建的節點指針LNode *r;//定義尾節點指針L = (LinkList)malloc(sizeof(LNode));//開辟一塊空間,創建頭節點r = L;//初始化尾節點為頭節點int x;scanf_s("%d", &x);while (x != 9999) {s = (LinkList)malloc(sizeof(LNode));//開辟一塊空間存儲需要創建的節點s->data = x;//s->next = NULL; //清空尾節點的指針域r->next = s;r = s;scanf_s("%d", &x);}r->next = NULL; //清空尾節點的指針域return L; }

按序號查找節點:

/* 按序號查找法 */ //*getElem表示返回節點指針類型,不加*則表示返回節點 LNode *getElemByIndex(LinkList L, int i) {LNode *p = L->next;//把頭節點賦值給pint j = 1;//表示從1開始查找if (i < 1) {//線性表下標從1開始return NULL;}//遍歷查找:下一個節點存在且還未到達查找點while (p && j<i){p = p->next;j++;} }

按值查找表節點:

/* 按值查找表節點 e:需要查找的值,泛型表示法(偽代碼):ElemetnType e,這里簡單表示為int */ LNode *getElemByValue(LinkList L, int e) {LNode *q = L->next;//獲取頭節點int s = q->data;//遍歷查找while (q != NULL && s != e){q = q->next;s = q->data;}return q; }

在指定的位置i處插入節點:

/* function:插入節點,在指定的位置i處插入節點 i:需要插入的位置 e:需要插入的節點 */ LinkList insertAtIndex(LinkList &L, int i, LNode *e) {if (i < 1) {return NULL;}LNode *p = L->next;//獲取頭節點int j = 1;//查找需要插入節點的前驅節點while (p != NULL && j < i-1) {p = p->next;}e->next = p->next;p->next = e; }

刪除指定的節點:

/* 刪除指定的節點 i:需要刪除的節點位置 */ LNode *deleteLNode(LinkList &L,int i) {//查找節點LNode *p = L->next;//獲取頭節點LNode *q;//需要刪除的節點int j = 1;while (p != NULL && j < i-1) {//找到需要刪除節點的上一個節點p = p->next;j++;}if (p == NULL) {//沒找到return NULL;}q = p->next;p->next = q->next;free(q);//釋放刪除節點的空間return q; }

求鏈表長度:

/* 求鏈表長度即依次遍歷累加求和 */ int getLength(LinkList &L) {LNode *p = L->next;//獲取頭節點int j = 1;while (p != NULL) {p = p->next;j++;}return j;}


以上為線性表鏈表中單鏈表的基本操作。





總結

以上是生活随笔為你收集整理的数据结构-链表之单链表的全部內容,希望文章能夠幫你解決所遇到的問題。

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