我数据结构学得不好啊。有个问题想不来了,比如:
给个数组,1,2,2,5,5,5,6,666,7,7,7,8
实现统计里面各个元素出现了多少次。比如有几个2,几个7。使用最简单得方法。怎么做啊??

解决方案 »

  1.   

    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;
    }
    没有验证的.
      

  2.   

    for(int j=0;j<12;j++)//这里也要从0开始,
      

  3.   

    楼上的有些问题吧,按上面的算法会输出这样的结果: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]);
      

  4.   

    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;
    }
    }
      

  5.   

    所有的代码里面。小刘的写得最好。我测试没有问题。
    但要加一句
    CString m_sz;
    m_sz = "数值\t次数";laiyiling(最熟悉的陌生人) 存在一个剔除重复的问题。谢谢大家。
    sailor_2002(我心依旧) 的说法我想过但是没有写成功。
    无比感谢大家。
      

  6.   

    wing0(d-link说先排序就简单。显然不对。统计次数必须遍历。与顺序无关。
    “好像哈夫曼算法可以解决这个问题,你这个问题类似于找最优二叉树,按路径长度来统计出现次数
    ”属于典型的简单问题复杂化。
    不知道我总结的对不对。如果大家还感兴趣继续讨论。分不够可以再加。
      

  7.   

    这么多我最佩服“小刘”了
    真的是高手啊!
    可是我有点太笨了,看不明白啊
    能不能给分析一下啊
    还有啊
    我觉得laiyiling(最熟悉的陌生人)的没什么问题啊(我没有自己验证!)
    为什么会有重复的呢?
      

  8.   

    显然是个高手
    我做了注解。大家共享。谢谢。不知道对不对。
    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);

    }
      

  9.   

    经过研究。我发现
    我觉得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();