求解简单的向量问题

smartdrvsky 2006-03-10 10:49:17
已知一个向量中元素按非递减有序排列,
编写一个函数删除向量中多余的相同的元素。

我自己想了一思路,不足之处望各位老师解答
思路如下:
用两个循环,第一个循环实现比较功能(比较a[i]是否大于a[i+1])
第二个循环实现如果有重复的元素则删除多余的然后向前移位。
我自己的解法如下:
avoid delete (vector v1)
{int i=0,j;
if (a([i]>a[i+1]i<=&&v1.length-1))
i++;
for (j=i,j<=v1.length-1,j++)
v1.a[j-1]=v1.a[j];
v1.length--;
}

我自己反复思考了一下,觉得第一个循环没实现,因为只是比较相邻两个元素,然后第二个循环没有嵌套到第一个循环中。

我初学数据结构,关于简单的向量操作也不太熟悉,望高手将上述函数功能完善为盼!(在线等)

另外向量我是这样定义的
struct vector
int a[ ]
int length
vector v1
...全文
129 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
smartdrvsky 2006-03-12
  • 打赏
  • 举报
回复
TO wshcdr(dd):
你的代码我基本上看懂了,是不是有一点需要完善呢?
1、如果有相同元素,是不是应该把数组长度减去相应的长度?
2、语句最后printf实现的函数功能的作用是?"%4d"的作用是?
恳请解答为盼,

最后再次感谢各位老师热心解答,
wshcdr 2006-03-11
  • 打赏
  • 举报
回复
1.楼主去参考一下选择排序的算法
void Select_Sort(int R[],int n)
{ int i,j,k,t;
for(i=1;i<n;i++)
{ for(k=i,j=i+1;j<=n;j++)
{ if(R[j]<R[k])
k=j;
}
if(i!=k)
{ R[0]=R[k];
R[k]=R[i];
R[i]=R[0];
}
for(t=1;t<=n;t++)
printf("%4d",R[t]);
printf("\n");
}
}

然后自己去删掉重复的值
SEUU 2006-03-11
  • 打赏
  • 举报
回复
使用标准模板库(STL)中,unique函数就可以实现对一个排序数组删除相同数据的功能。

这个方法好,有现成的就是要用现成的,这就是C++!
你只要会用就行,不要去学太深,不过看你的想法主要是学算法,多看看数据结构吧.

还有,你的分多给我一点吧,我是来得分的,我只要星星!
province_ 2006-03-11
  • 打赏
  • 举报
回复
i=0
while i<v1.length-1
if v1.a(i)=v1.a(i+1) then
for j=i+1 to v1.length-2
v1.a(j)=v1.a(j+1)
next
v1.length=v1.length-1
else
i=i+1
end if
wend
smartdrvsky 2006-03-11
  • 打赏
  • 举报
回复
哦,对了,透明,我说的是用C编,不是C++
C++我暂时还没学
smartdrvsky 2006-03-11
  • 打赏
  • 举报
回复
TO gyj_china(透明):
你的思路很好,解答过程也很完整,但个人感觉初学者很难理解,麻烦你利用简单向量与数组操作语言将我所发代码完善吗?谢谢你的热情解答。
TO ugg(逸学堂(exuetang.net)) :
无疑你的思路是最简洁的,可是我暂时还没学习STL,谢谢你的热情解答
csu_yzb 2006-03-11
  • 打赏
  • 举报
回复
同意楼上的!
逸学堂 2006-03-11
  • 打赏
  • 举报
回复
使用标准模板库(STL)中,unique函数就可以实现对一个排序数组删除相同数据的功能。
gyj_china 2006-03-11
  • 打赏
  • 举报
回复
不好意思,光写代码没讲思路,其它很简单.一个循环就可以了,上面我定义了两个游标,开始分别指向同一个向量首地址,但在比较时我把一个游标向后移了一位 if (*(++vi) == *p),如果相邻两位相同则删除后面的数据,游标位置不变化,再比较后面填充上来的数据.直到全部遍历一遍为止.
gyj_china 2006-03-11
  • 打赏
  • 举报
回复
已知一个向量中元素按非递减有序排列,
编写一个函数删除向量中多余的相同的元素。

//vector<int>out_vec必需是排过序的
int erase(vector<int>out_vec)
{
vector<int>::iterator vi;
vector<int>::iterator p;
for (vi = out_vec.begin(), p = out_vec.begin(); p != out_vec.end()-1; p++){
if (*(++vi) == *p)
{
out_vec.erase(vi);
p--;
vi--;
}
}
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧