社区
C++ 语言
帖子详情
如何将指定的元素插入至数组中指定的位置??
kgbkiller
2005-07-26 08:07:30
如题~~
...全文
1355
13
打赏
收藏
如何将指定的元素插入至数组中指定的位置??
如题~~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hjf1010
2005-07-26
打赏
举报
回复
不可以直接通过修改指针的值来修改数组大小。
不过可以这样
int buf[10];
buf=(int *)realloc(buf,size*sizeof(int));
数组分配多大是在程序执行前就要确定的,超过这个范围问题是很严重的,可能出现意想不到的后果,
这是c中很有名的越界问题,也是c的弱点之一,他没有提供数组越界保护.
kgbkiller
2005-07-26
打赏
举报
回复
windking21(暗淡) 我还是个新手刚开始学C++看不太懂啊
我想问的是如何指向数组元素个数的指针,可不可以改变该指针的值改变数组的大小?
jlkzzh
2005-07-26
打赏
举报
回复
1要防止叔祖益处
2选定位置数据后移
beyondtkl
2005-07-26
打赏
举报
回复
同意樓上。。。不過 各有合適的地方就就是
看你看重哪一方面了。
megaboy
2005-07-26
打赏
举报
回复
楼主应该用一个链表来实现,数组不利于移动、添加和删除,链表做这个很方便的。
数组利于随机访问。
luyanfei78
2005-07-26
打赏
举报
回复
数组在编译时必须确定所用的空间,所以在空间分配好以后再插入一个元素必会导致重新分配空间。一般的做法就是在堆内存中重新分配n+1个(假设数组原来长度是n)该类型数据的空间,然后把原数组拷贝过来,待到插入位置写入新元素。
如果是使用C++里的vector,则大可不必如此,因为vector提供了insert成员函数。调用方式如下:
iterator insert(
iterator _Where,
const Type& _Val
);
只须传入插入位置和插入值即可。上面有位朋友提供了list方案来解决,当然是好,但我就是不明白,放着STL里现成的list不用,自己来写,太不划算了吧。
PMsg
2005-07-26
打赏
举报
回复
给你个模版 实现了链表中的元素添加 删除 等功能
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
template <typename datatype>
class Collection
{
public:
Collection();
virtual ~Collection();
bool Add(const datatype &value);
void Add(Collection<datatype> &c);
bool Delete(const datatype &value);
void Clear();
const datatype& operator [](const int &index);
const bool operator ==(Collection<datatype> &c);
Collection<datatype> & operator =(Collection<datatype> &c);
int GetSize();
void CombineIt(Collection<Combine> &collection, int n);
private:
void _combine(Collection<Combine> &collection, Combine &combined, int n, int index);
struct Element
{
Element() : next(0)
{
}
datatype value;
Element *next;
};
Element *head, *tail;
int size;
};
#endif // !defined(AFX_OLLECTION_H__800AF24D_61D8_4E97_B6A0_08BE4CFAB1ED__INCLUDED_)
template <typename datatype>
Collection<datatype>::Collection() : size(0), head(new Element), tail(head)
{
head->next = 0;
}
template <typename datatype>
Collection<datatype>::~Collection()
{
Clear();
delete head;
}
// 向集合添加一个元素
// 返回true表示成功添加,返回false表示未添加
template <typename datatype>
bool Collection<datatype>::Add(const datatype &value)
{
// 查找是否已经存在相同元素
/* for(Element *e = head->next; e != 0; e = e->next)
{
if(e->value == value)
{
return false;
}
} */
// 为新元素分配空间
tail->next = new Element;
if(tail->next == 0)
{
return false;
}
tail = tail->next;
tail->next = 0;
tail->value = value;
size ++;
return true;
}
template <typename datatype>
void Collection<datatype>::Add(Collection<datatype> &c)
{
int size = c.size;
for(int i = 0; i < size; i++)
{
Add(c[i]);
}
}
// 从集合中删除一个元素
// 返回true表示成功删除,返回false表示元素未找到
/*template <typename datatype>
bool Collection<datatype>::Delete(const datatype &value)
{
// 在集合中查找要删除的元素
for(Element *e = head; e->next != 0; e = e->next)
{
if(e->next->value == value)
{
// 如果要删除的是尾结点,则把尾指针前移一位
if(e->next == tail)
{
tail = e;
}
// 从元素链中去除结点
Element *temp = e->next;
e->next = temp->next;
delete temp;
size --;
return true;
}
}
return false;
}*/
// 清除集合中的所有元素
// 即需要释放链表每个结点的内存空间
// 头结点除外
template <typename datatype>
void Collection<datatype>::Clear()
{
Element *temp = 0;
for(Element *e = head->next; e != 0; e = temp)
{
temp = e->next;
delete e;
}
}
// 返回指定索引的元素
template <typename datatype>
const datatype& Collection<datatype>::operator [](const int &index)
{
// 判断索引是否超出范围
if(index >= size)
{
std::cerr << "Index out of range!" << std::endl;
exit(1);
}
// 查找元素
// 从头结点开始数,每次后移一个结点,数到第index为止
Element *e = head->next;
for(int i = 0; i < index; i++,e = e->next);
// 返回第index个值
return e->value;
}
// 判断两个集合是否相等(元素个数及每个元素相等)
// 运算符重载,使对象可以使用==来判断是否相等
// 以下运算符重载类似
template <typename datatype>
const bool Collection<datatype>::operator ==(Collection<datatype> &c)
{
int size1 = size;
int size2 = c.size;
if(size1 != size2)
{
return false;
}
if(size1 == 0)
{
return true;
}
bool exist;
// 在集合1中查找是否存在集合2中的元素
for(int i = 0; i < size1; i++)
{
exist = false;
for(int j = 0; j < size2; j++)
{
// 利用[]运算符重载直接查找元素
if((*this)[i] == c[j])
{
exist = true;
break;
}
}
// 有一个元素不存在即返回false
if(!exist)
{
return false;
}
}
return true;
}
template <typename datatype>
Collection<datatype> &Collection<datatype>::operator =(Collection<datatype> &c)
{
// 清除当前集合中所有元素
Clear();
// 复制新元素到当前集合
Add(c);
}
// 返回当前集合中的元素个数
template <typename datatype>
int Collection<datatype>::GetSize()
{
return size;
}
// 求一个集合的组合,结果放入collection中
template <typename datatype>
void Collection<datatype>::CombineIt(Collection<Combine> &collection, int n)
{
if(n > size)
{
std::cerr << "Invalid n!" << std::endl;
exit(1);
}
Combine combined(n);
_combine(collection, combined, n, -1);
}
template <typename datatype>
void Collection<datatype>::_combine(Collection<Combine> &collection, Combine &combined, int n, int index)
{
int dest = size - n;
if(n > 0)
{
for(int i = index + 1; i <= dest; i++)
{
combined.data[--n] = (*this)[i];
_combine(collection, combined, n++, i);
}
}
else
{
collection.Add(combined);
}
}
jsjjms
2005-07-26
打赏
举报
回复
int a[] = {....};
int *p = a;
p就指向 数组a的指针了。
zh1369
2005-07-26
打赏
举报
回复
思路是---链表
a[n],b,temp,index
temp=a[index-1];
a[index-1]=&b;
b=a[index-1];
插入!(结构自己设计)
hjf1010
2005-07-26
打赏
举报
回复
数组名就是指向数组的指针,并且这个指针是不能改变的,即:定义 int buf[10],则buf就是指向这个数组第一个元素的指针,并且不能通过buf=buf+1这样的形式改变buf的指向.
要设置指向数组空间的指针很简单,定义int *ptr;ptr=buf;就可以了.并且ptr+1指向第二个数组元素,依次类推.用指针和数组下标可以随意指向任何数组元素.如buf[8], *(ptr+6)等,并不是只能顺序访问.
另外,数组是一块连续的内存空间,这和链表是两回事.
不知道这样解释符合楼主的意思吗?
kgbkiller
2005-07-26
打赏
举报
回复
如何将已定义的数组空间改变呢?我是个新手 怎么设置指向数组空间的指针啊?要定义常量么?
还有能不能象改变数组的存储是不是链式的?可不可以只改变插入位置前后的元素指针指向新的元素,而不是逐个移动?
可以的给个简单的例程 谢谢了
jsjjms
2005-07-26
打赏
举报
回复
很简单呀,最简单的方法就是用一个循环,先将数组空间加一,然后将指定位置后的元素全部向后
移动一个位置,将需要插入的数据插入。。。
OpenHero
2005-07-26
打赏
举报
回复
int a[10];
a[3] = 1;
???
是这个样吗?
C++将单个
元素
插入
到数组
指定
位置
或者删除
指定
位置
的数组
元素
C++将单个
元素
插入
到数组
指定
位置
或者删除
指定
位置
的数组
元素
在C++的三种容器中,string 和 vector都有
插入
和删除的函数,数组的
插入
是将目标
位置
的
元素
及之后的
元素
向后移一位,而删除操作是将目标
位置
之后的所有...
在JS数组
指定
位置
插入
元素
原文链接: Array: Insert an Item at a Specific Index with JavaScript原文日期: 2014年07月24日翻译日期: ...最近我碰到了这样一个需求: 将一个
元素
插入
到现有数组的特定索引处。听起来很容易和常见,但需要一点时间
Javascript,将
元素
插入
到
数组中
指定
位置
数组
指定
位置
插入
元素
: var array = ["one", "two", "four"]; // 原来的数组 array.splice(2, 0, "three"); // splice(position, numberOfItemsToRemove, item) // 拼接函数(索引
位置
, 要删除
元素
的数量,
元素
...
在数组
指定
位置
插入
元素
在数组
指定
位置
插入
元素
Day5 在数组的
指定
位置
插入
元素
不调用API在数组的
指定
位置
插入
元素
首先明白两个概念 向量 数组 数组
数组中
的
元素
A[i]A[i]A[i] 的物理地址可以通过公式$ A + i*s $ 推导出来,显然这是线性的存储结构,因此被称作:线性数组。 向量 邓工总结...
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章