仅供参考,学习交流,如有雷同,你抄我的
本次作业顺序表全部由数组实现,在此对每道题目列出两种做法,但不赘述所有方法,仅供大家了解算法优化,拓展思维。
1.
//对顺序表A插入一个值,使其仍为顺序表
//顺序表数组实现,二分查找位置
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
using namespace std;
void init(int *a,int l){
cout<<"请输入长度为5的数组,预置插入的数为7"<<endl;
for(int i = 0;i < l;i++)
cin>>a[i];
return;
}
int Find(int num,int *a,int l){
int lef = 0,rig = l-1,mid = (lef+rig)/2;
while(lef+1 < rig){
if(a[lef] <= num)return lef;
if(a[rig] >= num)return rig + 1;
if(a[mid] == num)return mid;
if(a[mid] < num)rig = mid,mid = (lef+rig)/2;
else lef = mid,mid = (lef+rig)/2;
}
if(a[mid] > num && a[mid + 1] < num)
return mid + 1;
else return mid;
}
void insert(int num,int*a, int p,int l){
for(int i = l;i > p;i--)
a[i] = a[i - 1];
a[p] = num;
return;
}
void print(int *a,int l){
for(int i = 0;i <= l;i++)
cout<<a[i]<<" ";
return;
}
int main(){
int A[1000],len = 5,t = 7,pos = -1;//初始化数据,len为长度,t为插入的数
init(A,len);
pos = Find(t,A,len);
insert(t,A,pos,len);
print(A,len);
return 0;
}
//对顺序表A插入一个值,顺序查找位置
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
using namespace std;
void init(int *a,int l){
cout<<"请输入长度为5的数组,预置插入的数为7"<<endl;
for(int i = 0;i < l;i++)
cin>>a[i];
return;
}
int Find(int num,int *a,int l){
for(int i = 0;i < l;i++)
if(a[i] < num)
return i;
return l;
}
void insert(int num,int*a, int p,int l){
for(int i = l;i > p;i--)
a[i] = a[i - 1];
a[p] = num;
return;
}
void print(int *a,int l){
for(int i = 0;i <= l;i++)
cout<<a[i]<<" ";
return;
}
int main(){
int A[1000],len = 5,t = 7,pos = -1;//初始化数据,len为长度,t为插入的数
init(A,len);
pos = Find(t,A,len);
insert(t,A,pos,len);
print(A,len);
return 0;
}
2.
//删除顺序表中重复的元素
//再开一个数组,O(n)做法
#include<iostream>
#include<cstdio>
using namespace std;
void init(int *a,int*l){
cout<<"请输入数列长度"<<endl;
cin>>(*l);
cout<<"请输入数列"<<endl;
for(int i = 0;i < (*l);i++)
cin>>a[i];
}
int del(int *a,int *ans,int l){
int mar = 0;
ans[mar] = a[0];
for(int i = 1;i < l;i++){
if(a[i] == ans[mar])continue;
else ans[(++mar)] = a[i];
}
return mar;
}
int main(){
int a[5500],ans[5500],len;
init(a,&len);
int mar = del(a,ans,len);
for(int i = 0;i <= mar;i++)
cout<<ans[i]<<" ";
return 0;
}
//删除顺序表中重复的元素
//仅使用原数组,O(n2)做法
//时间换空间的特点
#include<iostream>
#include<cstdio>
using namespace std;
void init(int *a,int*l){
cout<<"请输入数列长度"<<endl;
cin>>(*l);
cout<<"请输入数列"<<endl;
for(int i = 0;i < (*l);i++)
cin>>a[i];
}
int del(int *a,int *l){
for(int i = 0;i < *l - 1;i++)
while(a[i] == a[i + 1]){
for(int j = i+1;j <= *l - 1;j++)
a[j] = a[j + 1];
(*l)--;
}
}
int main(){
int a[5500],len;
init(a,&len);
del(a,&len);
for(int i = 0;i < len;i++)
cout<<a[i]<<" ";
return 0;
}
3.
//逆置顺序表
//使用一个临时变量应该也可以,但可以通过简单的加减法完全不使用额外的空间
//加减改成乘除也可以
#include<iostream>
#include<cstdio>
using namespace std;
void deal(int * a,int l){
for(int i = 0;i < l/2;i++)
a[i]+=a[l-1-i], a[l-1-i] = a[i] - a[l-1-i],a[i]-=a[l-i-1];
}
int main(){
int a[10000],len;
cout<<"请输入数组长度"<<endl;
cin>>len;
cout<<"请输入数列"<<endl;
for(int i = 0;i < len;i++)
cin>>a[i];
deal(a,len);
for(int i = 0;i < len;i++)
cout<<a[i]<<" ";
return 0;
}
//逆置顺序表
//加减可以改为异或运算,其实时间复杂度上差异不大
#include<iostream>
#include<cstdio>
using namespace std;
void deal(int * a,int l){
for(int i = 0;i < l/2;i++)
a[i]^=a[l-1-i], a[l-1-i] ^= a[i],a[i]^=a[l-i-1];
}
int main(){
int a[10000],len;
cout<<"请输入数组长度"<<endl;
cin>>len;
cout<<"请输入数列"<<endl;
for(int i = 0;i < len;i++)
cin>>a[i];
deal(a,len);
for(int i = 0;i < len;i++)
cout<<a[i]<<" ";
return 0;
}