高手们,谁能实现这个算法呢?本人自觉水平很高,花了半个月没有完成!

LoveyuerForever 2003-12-12 11:18:26
说明一点:必须按要求完成!
使用new运算符实现下面的算法:
//v的元素以递增的次序排列,v[0]<=v[1]<=v[2]....
//在v中插入项,使v保持递增顺序.
template <typename T>
void insertOrder( Vector<T>& v,const T& itme );

//v具有递增次序,从v中删除重复值.例如,如果T=int,则将向量
//v={1,1,2,3,3,3,7,7,8,9,9,10}
//转换为v={1,2,3,7,8,9,10}
template <typename T>
void removeDuplicates( Vector<T>& v )

注:一定要使用new运算符实现!
...全文
7 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
liansdan 2003-12-14


程序的基本算法是:如有足够空间,则将要加入位置后的元素后移,然后插入元素,
如果该元素已经存在,刚不做操作,这样数组中是没有重复的元素的
  • 打赏
  • 举报
回复
liansdan 2003-12-14
兄弟你要的东西我写的程序里都有,除了复制构造函数和重载“=”以外,但你认为在你这样一个程序里这两个函数有必要吗,
兄弟,结帖吧,不要让你的光辉形象受损呀^_^!!!!
  • 打赏
  • 举报
回复
liansdan 2003-12-14
你搞错没有,我的不就是你要求的答案吗?难道你没有看懂我写的程序,哪里不懂,提出来
我的程序已经满足你提的要求了
  • 打赏
  • 举报
回复
LoveyuerForever 2003-12-13
首先感谢各位的回复,帮我解决问题.只是不太符合要求,因此我把要求写的更清楚一些,并把类的声明也一并写出来.
说明:
我提问我两个函数即不是miniVector的成员函数,也不是其友元!是基于模板的free functions,请高手帮我实现好吗? 原题实际上是这样的:

使用new运算符实现下面的算法:
//v的元素以递增的次序排列,v[0]<=v[1]<=v[2]....
//在v中插入项,使v保持递增顺序.
template <typename T>
void insertOrder( miniVector<T>& v,const T& itme );

//v具有递增次序,从v中删除重复值.例如,如果T=int,则将向量
//v={1,1,2,3,3,3,7,7,8,9,9,10}
//转换为v={1,2,3,7,8,9,10}
template <typename T>
void removeDuplicates( miniVector<T>& v )

注:一定要使用new运算符实现!
  • 打赏
  • 举报
回复
LoveyuerForever 2003-12-13
以下我自己编的Vector的"mini"版本:miniVector的类声明:
#ifndef MINI_VECTOR
#define MINI_VECTOR

#include "d_except.h" // include exception classes

using namespace std;

template <typename T>
class miniVector
{
public:
miniVector(int size = 0);
// 构造函数.
// 前提条件: 用指定的大小分配数组
// 后置条件: 元素被初始化为类型T的默认值T
miniVector(const miniVector<T>& obj);
// 复制构造函数
// 结果: 以obj的副本创建了当前对象
~miniVector();
// 析构函数
// 结果: 动态数组被销毁

miniVector& operator= (const miniVector<T>& rhs);
// 赋值运算符.

T& back();
// 返回向量的最后一个元素.
// 前提条件: 向量非空.否则产生underflowException异常
const T& back() const;
// 常量版本 用于miniVector对象是常量的情况

T& operator[] (int i);
// 提供了通过下标对向量元素的一般化访问.
// 前提条件: 0 <= i < vSize. 如果下标出界抛出underflowException异常

const T& operator[] (int i) const;
// 提供了对常向量访问的常量版本

void push_back(const T& item);
// 在向量尾部插入元素
// 结果:向量大小加1

void pop_back();
// 移除向量的最近一个元素
// 前提条件: 向量非空,否则抛出异常

int size() const;
// 返回当前列表的大小

bool empty() const;
//向量是否为空

int capacity() const;
// 返回当前向量的容量

void insert(int i,const T& item);
//在向量的下标i处插入项
//前提条件,向量非空,且0<=i<=vSize
//后置条件,向量的大小加1

void erase(int i);
//删除向量中下标为i的项
//前提条件,向量为空,且0<=i<=vSize
//后置条件,向量大小减1
void resize(int i);
//重置向量的大小

private:
int vCapacity; // 可用空间数,亦即容量
int vSize; // 元素的个数
T *vArr; // 动态数组

void reserve(int n, bool copy);
// 仅当 n > vCapacity被公共成员函数调用. 将向量的容量扩展到N个元素那么
//大 ,如果copy为true,将现存的元素复制到新的动态数组中并删除旧的动态数组
//如果申请内容失败,则产生memoryAllocationException异常
};
  • 打赏
  • 举报
回复
Edison621 2003-12-12
ft,我自覺英俊瀟洒...
  • 打赏
  • 举报
回复
ZhangYv 2003-12-12
就这怎么算高?入门而已
  • 打赏
  • 举报
回复
xiaoyige886 2003-12-12
typedef int ElemType;//自定义类型
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode,*LinkList;

LinkList Delete_same(LinkList L)
{
LinkList p = L;

while(p != NULL)
{
Linklist q = p -> next;
while (q != NULL && q -> data == p -> data) //删除并释放所有与p“相等”的节点
{
p -> next = q -> next;
delete q;
q = p -> next;
}
p = q;
}
return L;
}

算法就是这样的,以前plainsong给的(我写的比较烂),用的是链表的形式
你自己改改吧!
  • 打赏
  • 举报
回复
liansdan 2003-12-12
不知道楼主是要在数组中完成,还是在链表中完成,在链表中简单一点,在数组中难一点,
数组中增加减少元素的操作本来就是它的缺陷,不然还要链表干什么,
以下是以数组为结构

class Num{
public:
T *pNum;//数组指针
int maxsize;//数组最大值
int pcurrentsize;//数组当前大小
Num(const int n);//数组初始
int rightmove(int n);//如果空间还允许的话,将第n个位置及以后元素右移一位
int cmp(const T& item);//将要插入的元素与数组中的元素比较,如果有相等的返回0,否则//返回它的位置
void insertOrder(const T& item);//插入元素item
};//这里没有排序的函数,你可以加一个,处理数组未排序的情况
Num::Num(const int n){
T *p=new T[n];
pNum=p;
maxsize=n;
pcurrent=0;
}
int Num::rightmove(int n){
T temp;
if(pcurrentsize==maxsize)return 0;
for(int i=0,int j=1;i<pcurrentsize-n;i++,j++)
pNum[pcurrentsize-i]=pNum[pcurrentsize-j];
return 1;
}
int Num::cmp(const T& item){
for(int i=0;i<pcurrent;i++){
if(item>pNum[i])continue;
else if(item<pNum[i]||)return i+1;
else if(item==pNum[i])return 0;
}
}
int Num::insertOrder(const T& item){
int i=cmp(item);
if(!i)return 1;
rightmove(i);
pNum[i-1]=item;
pcurrentsize++;
return 1;
}

写好后没仔细检查,但基本上表达了我的意思,
满意的话,你可要给一百分呀.20分实在太少了,50分也行,
我QQ:
8725932
有空聊!!!!
有错误的大家指教!!!!











  • 打赏
  • 举报
回复
laker_tmj 2003-12-12
up learn
  • 打赏
  • 举报
回复
xiaoyige886 2003-12-12
我帮你吧 我c++刚学不久的说! devc++ 通过!

#include<iostream>
#include<vector>
#include<stdlib.h>
#include<algorithm>
using namespace std;

int main(void)
{
int a[] ={1,1,2,3,3,3,7,7,8,9,9,10};
vector<int>ivec(a,a+sizeof(a)/4);
vector< int >::iterator iter;
for(int i=0; i<ivec.size()-1; ++i)
{
if(ivec[i]==ivec[i+1])
{
iter = find(ivec.begin(),ivec.end(),ivec[i+1]);
ivec.erase(iter);
i--;
}

}
for( int i =0; i<ivec.size(); ++i )
cout << ivec[i] << " ";
system("pause");
}
  • 打赏
  • 举报
回复
qufan 2003-12-12
作作看了
  • 打赏
  • 举报
回复
yjh1982 2003-12-12
楼主示例一下用发,"用new实现"是啥意思?
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.1w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
申请成为版主
帖子事件
创建了帖子
2003-12-12 11:18
社区公告
暂无公告