C++實現(xiàn)動態(tài)數(shù)組實踐
更新時間:2026年05月28日 09:03:00 作者:byg_qlh
這段C++代碼實現(xiàn)了動態(tài)數(shù)組的多種操作,包括初始化、賦值、打印、增刪改查等,通過這些操作可以靈活地管理數(shù)組數(shù)據(jù),適用于需要動態(tài)調(diào)整數(shù)組大小的場景
C++實現(xiàn)動態(tài)數(shù)組
- 1. 數(shù)組初始化
- 2. 給數(shù)組賦值
- 3. 打印數(shù)組
- 4. 增加數(shù)組長度
- 5. 數(shù)組最后一個值替代最小值
- 6. 逆置數(shù)組元素
- 7. 逆置數(shù)組中指定位置范圍的元素
- 8. 刪除數(shù)組中值為x的所有元素
- 9. 刪除所有介于s和t之間(包含s與t)的元素
- 10. 有序表中刪除相同元素
- 11. 合并兩個有序數(shù)組,合并結(jié)果存入第三個數(shù)組
- 12. 將數(shù)組中的前m位與后n為的位置互換
整體代碼
如下:
#include<iostream>
using namespace std;
struct SeList{//struct結(jié)構(gòu)體與class唯一的區(qū)別就是默認訪問權(quán)限不一樣
int *data;//struct默認是public的訪問權(quán)限,所以方便用于作為節(jié)點結(jié)構(gòu)體
int Max;//動態(tài)數(shù)組的整體思想是在結(jié)構(gòu)體內(nèi)聲明指針,最大長度,實際長度,在外部函數(shù)中生成實際的數(shù)組,數(shù)組的這三個主要指標放在了結(jié)構(gòu)體中
int length;
};
void initList(SeList &list,int x){//數(shù)組初始化
list.data=new int[x];
list.Max=x;
list.length=0;
}
void setList(SeList &list){//給數(shù)組賦值
for(int i=0;i<list.Max;++i){
list.data[i]=i+1;
if(list.length<list.Max){
list.length++;
}
}
}
void set_List(SeList &list){//給數(shù)組賦值
for(int i=0;i<list.Max/2;++i){
list.data[i]=i+1;
if(list.length<list.Max/2){
list.length++;
}
}
}
void printList(SeList &list){//打印數(shù)組
for(int i=0;i<list.length;++i){
cout<<list.data[i]<<" ";
}
cout<<endl;
}
void increaseList(SeList &list,int len){//增加數(shù)組長度
int *p=list.data;
list.data=new int[list.Max+len];
for(int i=0;i<list.length;++i){
list.data[i]=p[i];
}
list.Max=list.Max+len;
delete[] p;
}
bool deleteMin(SeList &list,int &value){//數(shù)組最后一個值替代最小值
if(list.length==0){
return false;
}
value=list.data[0];
int a=0;//輔助變量,記錄最小元素的位置
for(int i=0;i<list.length;++i){
if(value>list.data[i]){
value=list.data[i];
a=i;
}
}
list.data[a]=list.data[list.length-1];
return true;
}
bool reverseList(SeList &list){//逆置數(shù)組元素
if(list.length==0){
return false;
}
int temp=0;//輔助變量
for(int i=0;i<list.length/2;++i){//無需考慮數(shù)組元素個數(shù)的奇偶性,因為length/2取整
temp=list.data[i];
list.data[i]=list.data[list.length-i-1];
list.data[list.length-i-1]=temp;
}
return true;
}
bool reverse_List(SeList &list,int m,int n){//逆置數(shù)組中指定位置范圍的元素
if(list.length==0||m>=n){
return false;
}
int temp=0,k=0;
for(int i=m-1;i<=(n+m-2)/2;++i){
temp=list.data[i];
list.data[i]=list.data[n-1-k];
list.data[n-1-k]=temp;
++k;
}
}
void deleteX(SeList &list,int x){//刪除數(shù)組中值為x的所有元素
int k=0;//記錄非x的元素個數(shù),也就是保留下來的元素個數(shù)
for(int i=0;i<list.length;++i){//順序掃描數(shù)組,每判斷一個非x值就加入結(jié)果數(shù)組
if(list.data[i]!=x){//非x元素保留下來,這里利用了i的值一定大于等于k的值,所以在一個循環(huán)中就可以解決問題
list.data[k]=list.data[i];
++k;
}
}
list.length=k;//修改數(shù)組長度
}
bool deleteST(SeList &list,int s,int t){//刪除所有介于s和t之間(包含s與t)的元素
if(s>=t){
cout<<"輸入范圍錯誤"<<endl;
return false;
}
if(list.length==0){
cout<<"順序表為空"<<endl;
return false;
}
int k=0;// 記錄不在范圍s與t之間的元素的個數(shù)
for(int i=0;i<list.length;++i){//順序掃描數(shù)組,每判斷到一個不屬于s與t之間的元素就加入結(jié)果數(shù)組
if(list.data[i]<s||list.data[i]>t){
list.data[k]=list.data[i];
++k;
}
}
list.length=k;//修改數(shù)組長度
return true;
}
void deleteSame(SeList &list){//有序表中刪除相同元素
int k=1;//非相同元素的個數(shù)
for(int i=1;i<list.length;++i){// 因為第一個肯定不重復(fù),從第二個元素開始順序掃描數(shù)組,每判斷到一個不是相同的元素就將其加入結(jié)果數(shù)組
if(list.data[i]!=list.data[i-1]){
list.data[k]=list.data[i];
++k;
}
}
list.length=k;//修改數(shù)組長度
}
bool addList(SeList list1,SeList list2,SeList &list){//合并兩個有序數(shù)組,合并結(jié)果存入第三個數(shù)組
if(list1.length+list2.length>list.Max){//如果前兩個數(shù)組的長度之和大于第三個數(shù)組長度最大值,無法合并,返回錯誤
return false;
}
int i=0;//輔助變量,記錄第一個數(shù)組的下標
int j=0;//輔助變量,記錄第二個數(shù)組的下標
int k=0;//輔助變量,記錄第三個數(shù)組的下標
while(i<list1.length&&i<list2.length){//這里使用while循環(huán),對判斷條件的設(shè)置比較關(guān)鍵;當兩個數(shù)組都沒有遍歷完時,比較兩個數(shù)組最前面的值,較小者加入結(jié)果數(shù)組
if(list1.data[i]<=list2.data[j]){
list.data[k]=list1.data[i];
k++;
i++;
}else{
list.data[k]=list2.data[j];
k++;
j++;
}
}
while(i<list1.length){//若只有第一個數(shù)組還沒有遍歷完,第一個數(shù)組剩余數(shù)據(jù)是表中較大的了,按順序加入結(jié)果數(shù)組即可
list.data[k]=list1.data[i];
k++;
i++;
}
while(j<list2.length){
list.data[k]=list2.data[j];
k++;
j++;
}
list.length=k;
return true;
}
bool invertList(SeList &list,int m,int n){//將數(shù)組中的前m位與后n為的位置互換,可以看做先將數(shù)組整個逆置,之后對目前的兩個數(shù)組分別再逆置,調(diào)用指定范圍的逆置函數(shù)實現(xiàn)
reverseList(list);
reverse_List(list,1,n);
reverse_List(list,n+1,n+m);
return true;
}
bool insert_List(SeList &list,int x){//若查到值為x的元素,將其與其后的元素交換位置,若查不到,則將其插入順序表中使得,順序表仍然遞增
int low=0;
int n=list.length-1;
int high=n;
int mid;
while(low<=high){
mid=(low+high)/2;
if(list.data[mid]==x){
break;
}else if(list.data[mid]<x){
low=mid+1;
}else{
high=mid-1;
}
}
if(list.data[mid]==x&&mid!=n){
list.data[mid]=list.data[mid+1];
list.data[mid+1]=x;
cout<<x<<endl;
}
if(low>high){
for(int i=n;i>high;--i){
list.data[i+1]=list.data[i];
list.data[i+1]=x;
cout<<x<<endl;
}
list.length++;
}
}
int main(){
SeList list1;
initList(list1,15);
setList(list1);//初始化并設(shè)置第一個數(shù)組
printList(list1);
SeList list2;
initList(list2,15);
set_List(list2);
printList(list2);//初始化并設(shè)置第二個數(shù)組
SeList list3;
initList(list3,30);
addList(list1,list2,list3);
printList(list3);
invertList(list1,6,9);
printList(list1);
insert_List(list2,5);
printList(list2);
return 0;
}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++自定義封裝socket操作業(yè)務(wù)類完整實例
這篇文章主要介紹了C++自定義封裝socket操作業(yè)務(wù)類,結(jié)合完整實例形式分析了Linux環(huán)境下C++操作socket的封裝業(yè)務(wù)類,可實現(xiàn)基本的socket連接、參數(shù)設(shè)置、發(fā)送請求等基本功能,需要的朋友可以參考下2017-08-08
詳解C語言中accept()函數(shù)和shutdown()函數(shù)的使用
這篇文章主要介紹了詳解C語言中accept()函數(shù)和shutdown()函數(shù)的使用,用來操作socket相關(guān)的網(wǎng)絡(luò)通信,需要的朋友可以參考下2015-09-09
C/C++和OpenCV實現(xiàn)調(diào)用攝像頭
本文主要介紹了C/C++和OpenCV實現(xiàn)調(diào)用攝像頭,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-05-05

