数据结构-链表之单链表
生活随笔
收集整理的這篇文章主要介紹了
数据结构-链表之单链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????單鏈表即每個節點都存在數據域和指針域(特殊節點除外),每個節點都一個直接前驅節點和直接后繼節點(頭節點無前驅,尾節點無后繼),簡單來說就是上一個節點的指針域中存放了下一個節點的地址,因此可以實現層層節點依次查找,時間復雜度為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++;} }按值查找表節點:
在指定的位置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; }求鏈表長度:
以上為線性表鏈表中單鏈表的基本操作。
總結
以上是生活随笔為你收集整理的数据结构-链表之单链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构-线性表之顺序表
- 下一篇: 数据结构-循环单链表之约瑟夫问题