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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

单链表删除所有值为x的元素_线性表之单链表

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单链表删除所有值为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?*c
urrent?=?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的元素_线性表之单链表的全部內容,希望文章能夠幫你解決所遇到的問題。

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