简单数据结构问题啊

zjg751206 2004-07-05 05:53:42
我数据结构学得不好啊。有个问题想不来了,比如:
给个数组,1,2,2,5,5,5,6,666,7,7,7,8
实现统计里面各个元素出现了多少次。比如有几个2,几个7。使用最简单得方法。怎么做啊??
...全文
149 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjg751206 2004-07-06
  • 打赏
  • 举报
回复
经过研究。我发现
我觉得laiyiling(最熟悉的陌生人)的思路很好。问题在于如何剔除重复。我在他思路的提示下这样写了算法。当然了这种思路好理解。
//在头文件中定义结构体
#include <vector>
using namespace std;
struct countValue
{
int value;
int num;
};
//和vector。因为为了剔除重复。我只有这么做了】


下面在代码中写。

#define ARRAY_NUM 12
int a[ARRAY_NUM]={1,2,2,5,5,5,6,666,7,7,7,8};

countValue mplist[ARRAY_NUM];
int count=0;
for(int i=0;i<ARRAY_NUM;i++)
{ for(int j=0;j<ARRAY_NUM;j++)
{ if(a[i]==a[j])
count++;
mplist[i].value = a[i];
mplist[i].num = count;
}
count=0;
}
vector<countValue>resultv;

static bool bFound = false;
for(i=0;i<ARRAY_NUM;i++)
{

for(int j=0;j<resultv.size();j++)
{
if(mplist[i].value ==resultv[j].value)
{
bFound = true;
break;
}else bFound = false;
}

if(!bFound)
{
resultv.push_back(mplist[i]);
bFound = false;
}
}

//************************************************
CString str;
for(i=0;i<resultv.size();i++)
{
if(mplist[i].num!=0)
{
str.Format("%d:: %d-----> %d",i,resultv[i].value,resultv[i].num);
AfxMessageBox(str);
}

}
resultv.clear();
zjg751206 2004-07-06
  • 打赏
  • 举报
回复
这个问题太经典了。写得太好。我数据结构不好。学习中。。。。。
zjg751206 2004-07-06
  • 打赏
  • 举报
回复
显然是个高手
我做了注解。大家共享。谢谢。不知道对不对。
struct CountInfo
{
int nValue;//值本身
int nCount;//计数
CountInfo* pNext;//下一个的指针。因为是数组。总有个结尾。必须有个指针。
};//定义结构体;用来保存数据。个数,以及指针指向下一个。

void CTestDlg::OnButton1()
{
int Number[] = {1,2,2,5,5,5,6,666,7,7,7,8};
count(Number,sizeof(Number) / sizeof(Number[0]));//这句代码经典。尤其是个数的计算。
}

void CTestDlg::count(int *pArray, int nArraySize)
{
CountInfo *pHead = NULL,*pTail = NULL,*pInfo = NULL;
//定义三个指针。头。尾,以及结构体本身。

for (int i = 0; i < nArraySize;++i)//开始循环。
{
pInfo = pHead;//将结构体指向头指针
while (pInfo)
{
if (pInfo->nValue == pArray[i])
{
pInfo->nCount++;
break;
}
else
pInfo = pInfo->pNext;
}//开始循环。没有结束继续循环。写得太好了。

if (!pInfo)//指针为空,刚开始必须创建
{
pInfo = new CountInfo;
if (!pHead)
pHead = pInfo;
if (pTail)
pTail->pNext = pInfo;
pTail = pInfo;//创建完成,但是没有和数组关联。
pInfo->nValue = pArray[i];//关联。赋值。
pInfo->nCount = 1;//刚开始指向第一个,已经有一个了。计数为1
pInfo->pNext = NULL;//刚开始创建。next当然为空。
}//创建完成后以后就不执行了。
}
char sz[100];
m_sz = "数值\t次数";
pInfo = pHead;//指向头部。循环显示。
while (pInfo)//循环显示值及其计数。
{
m_sz += "\r\n";
itoa(pInfo->nValue,sz,10);
m_sz += sz;
m_sz += '\t';
itoa(pInfo->nCount,sz,10);
m_sz += sz;
pInfo = pInfo->pNext;
}


pInfo = pHead;/循环清除结构体。
while (pInfo)
{
pHead = pInfo->pNext;
delete pInfo;
pInfo = pHead;
}

AfxMessageBox(m_sz);//显示统计结果。
UpdateData(FALSE);

}

shiyi0927 2004-07-06
  • 打赏
  • 举报
回复
不好意思啊1
刚才又仔细的看了一下,果然是有重复!
不过小刘的还是没弄明白!
菜鸟建议:记得写注释!
shiyi0927 2004-07-06
  • 打赏
  • 举报
回复
这么多我最佩服“小刘”了
真的是高手啊!
可是我有点太笨了,看不明白啊
能不能给分析一下啊
还有啊
我觉得laiyiling(最熟悉的陌生人)的没什么问题啊(我没有自己验证!)
为什么会有重复的呢?
zjg751206 2004-07-06
  • 打赏
  • 举报
回复
wing0(d-link说先排序就简单。显然不对。统计次数必须遍历。与顺序无关。
“好像哈夫曼算法可以解决这个问题,你这个问题类似于找最优二叉树,按路径长度来统计出现次数
”属于典型的简单问题复杂化。
不知道我总结的对不对。如果大家还感兴趣继续讨论。分不够可以再加。
zjg751206 2004-07-06
  • 打赏
  • 举报
回复
所有的代码里面。小刘的写得最好。我测试没有问题。
但要加一句
CString m_sz;
m_sz = "数值\t次数";

laiyiling(最熟悉的陌生人) 存在一个剔除重复的问题。谢谢大家。
sailor_2002(我心依旧) 的说法我想过但是没有写成功。
无比感谢大家。
wing0 2004-07-05
  • 打赏
  • 举报
回复
菜鸟想法:
先排序,然后不就简单了么?
dth_ljb 2004-07-05
  • 打赏
  • 举报
回复
struct CountInfo
{
int nValue;
int nCount;
CountInfo* pNext;
};

void CTestDlg::OnButton1()
{
int Number[] = {1,2,2,5,5,5,6,666,7,7,7,8};
count(Number,sizeof(Number) / sizeof(Number[0]));
}

void CTestDlg::count(int *pArray, int nArraySize)
{
CountInfo *pHead = NULL,*pTail = NULL,*pInfo = NULL;

for (int i = 0; i < nArraySize;++i)
{
pInfo = pHead;
while (pInfo)
{
if (pInfo->nValue == pArray[i])
{
pInfo->nCount++;
break;
}
else
pInfo = pInfo->pNext;
}
if (!pInfo)
{
pInfo = new CountInfo;
if (!pHead)
pHead = pInfo;
if (pTail)
pTail->pNext = pInfo;
pTail = pInfo;
pInfo->nValue = pArray[i];
pInfo->nCount = 1;
pInfo->pNext = NULL;
}
}
char sz[100];
m_sz = "数值\t次数";
pInfo = pHead;
while (pInfo)
{
m_sz += "\r\n";
itoa(pInfo->nValue,sz,10);
m_sz += sz;
m_sz += '\t';
itoa(pInfo->nCount,sz,10);
m_sz += sz;
pInfo = pInfo->pNext;
}
UpdateData(FALSE);

pInfo = pHead;
while (pInfo)
{
pHead = pInfo->pNext;
delete pInfo;
pInfo = pHead;
}
}
BBirdlyh 2004-07-05
  • 打赏
  • 举报
回复
楼上的有些问题吧,按上面的算法会输出这样的结果:1 1次 2 2次 2 2次 5 3次 5 3次……
int a[12]={1,2,2,5,5,5,6,666,7,7,7,8};
int k[12]={1,1,1,1,1,1,1,1,1,1,1,1};
for(int i=0;i<12;k[i]!=0;i++)
for(int j=0;j<12;j++)
{
if(a[i]==a[j])
{k[i]+=k[j];
k[j]=0;
break;}
for(int i=0;i<12;k[i]!=0;i++)
printf("%d:%d 次",a[i],k[i]);
Kudeet 2004-07-05
  • 打赏
  • 举报
回复
for(int j=0;j<12;j++)//这里也要从0开始,
Kudeet 2004-07-05
  • 打赏
  • 举报
回复
上面的错误,楼主删了回复吧!
sailor_2002 2004-07-05
  • 打赏
  • 举报
回复
哈哈,楼上这么快,如果楼主想要简单的算法,循环查找是最简单的了
sailor_2002 2004-07-05
  • 打赏
  • 举报
回复
好像哈夫曼算法可以解决这个问题,你这个问题类似于找最优二叉树,按路径长度来统计出现次数
Kudeet 2004-07-05
  • 打赏
  • 举报
回复
int a[12]={1,2,2,5,5,5,6,666,7,7,7,8}
int k[20];//保存每个数出现的次数
int count;
for(int i=0;i<12;i++)
{ for(int j=1;j<12;j++)
{ if(a[i]==a[j])
count++;
k[i]=count;
}
count=0;
}
没有验证的.
xdsh00 2004-07-05
  • 打赏
  • 举报
回复
比较笨的方法:写个链表,呵呵

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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