单链表删除所有值为x的元素_线性表之单链表
?單鏈表
一種以鏈接方式存儲的線性表,適用于頻繁增刪操作,存儲空間不定的情形。
單鏈表的一個存儲結點包含兩個域,數據域和指針域。數據域用于存儲線性表的一個數據元素,指針域用于指示下一個結點開始的存儲地址。
鏈表第一個結點的地址可通過頭指針找到,其他結點的地址則在前驅結點的指針域中,最后一個結點沒有后繼,用NULL終結。
為了操作的方便,習慣上單鏈表帶一個頭結點,也就是first指向的第一個結點不存放任何數據,從第二個結點開始存放數據。
由于指針域的存在,數據元素的順序與物理存儲順序可能不一致。
定義與封裝
//結點的定義struct?LinkNode?{????????//鏈表結點類的定義int?data;???????????//數據域
????LinkNode?*link;?????//鏈指針域
????LinkNode()?{?link?=?NULL;?}?????//構造函數
????LinkNode(int?item,?LinkNode?*ptr?=?NULL)
????{?data?=?item;??link?=?ptr;?}?????//構造函數
};//鏈表操作封裝
class?List{protected:LinkNode?*first;?????//表頭指針,頭結點public:
????List()?{?first?=?new?LinkNode;?}??//構造函數
????List(int?x)?{?first?=?new?LinkNode(x);?}
????~List(){?}??????????????????//析構函數void?inputFront?(int?val);LinkNode?*Search(int?x);????//搜索含x元素LinkNode?*Locate(int?i);????//返回第i個元素地址bool?Insert?(int?i,?int?x);?//在第i元素后插入bool?Remove(int?i,?int&?x);?//刪除第i個元素bool?IsEmpty()?const?????????//判表空否{?return?first->link?==?NULL???true?:?false;?}void?show();
};
帶附加頭結點的插入操作
1、newnode->link = p->link;?
2、p->link = newnode;
注意圖中標1和2的位置與代碼相結合
//將新元素 x 插入在鏈表中第 i 個結點之后。bool?List::Insert?(int?i,?int?x)?{
????LinkNode?*current?=?Locate(i);if?(current?==?NULL)?return?false;???//無插入位置?LinkNode?*newNode?=?new?LinkNode(x);?//創建新結點 ? ?//圖中標識的1處,在不破壞原鏈表的情況下讓新結點先鏈入
????newNode->link?=?current->link;???????//鏈入 ? ?//圖中標識的2處,接到新結點
????current->link?=?newNode;????????????return?true;????????????????
}
帶附加頭結點的查找操作
查找過程就是從第一個結點開始不斷沿著link域尋到和所需值相同的結點
//在表中搜索含數據x的結點,?搜索成功時函數返//該結點地址;?否則返回NULL。LinkNode?*List::Search(int?x)?{
?????LinkNode?*current?=?first->link;while(?current?!=?NULL?&&?current->data?!=?x?)??????
????????current?=?current->link;????//沿著鏈找含有x的結點return?current;
}
帶附加頭結點的刪除操作
1、q = p->link;
2、p->link = q->link;
3、delete q;?
//刪除鏈表第i個元素,?通過引用參數x返回元素值bool?List::Remove?(int?i,?int&?x?)?{//圖中指針p
????LinkNode?*current?=?Locate(i-1);if(current?==?NULL?||?current->link?==?NULL)???return?false;?????//刪除不成功??????//圖中指針q
? ? LinkNode?*del?=?current->link;?
? ? //圖中操作2,p的link指向指針q的link指向的域,越過q
????current->link?=?del->link;
????x?=?del->data;????//脫節的q可以直接刪除???delete?del;?return?true;
}
附加頭結點的單鏈表創建
一般單鏈表的創建可采用前插法或者尾插法,
前插法就是每來一個新的結點,就把這個結點插在頭結點的后面。
尾插法就是每來一個新的結點就把這個結點插在鏈表最后一個結點的后面,相比前插法需要設置一個尾指針。
實現插入過程和鏈表的插入操作幾乎無區別。
void?List::inputFront?(int?val)?{????LinkNode?*newNode?=?new?LinkNode;if(newNode==NULL)?return;
????newNode?=?new?LinkNode(val);newNode->link?=?first->link;??????//插在表前端
????first->link?=?newNode;
}
優點:
長度很容易方便擴充。
缺點:
存儲空間上多了指針域,存儲空間代價比順序表大。
至于帶附加頭節點和不帶附加頭節點的好處,看過書的同學都知道,前者的增刪操作更簡練
代碼https://github.com/xiaoYaChh/datastructure.git
參考資料:數據結構第二版,殷人昆,清華大學出版社
總結
以上是生活随笔為你收集整理的单链表删除所有值为x的元素_线性表之单链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK源码如何启动编译
- 下一篇: .net 日期总结,用于业务时间查询