鱼C论坛

 找回密码
 立即注册
查看: 2372|回复: 0

[技术交流] 我写的一个堆实现 大家帮看看有没BUG

[复制链接]
发表于 2012-1-8 11:17:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
老师布置的作业 写个可以变长存字符串的程序 要求缓存占最大使用率 跟堆差不多
  1. /*********************************************************
  2. * 此程序非动态生成字符串空间                             *
  3. * 要想获得更大空间 请修改三个宏                          *
  4. * 此程序不能指定位置添加数据.                            *
  5. * 此程序添加的数据需要键入s命令排序,非自动                *
  6. *********************************************************/
  7. #include "stdafx.h"
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <ctype.h>
  12. #define MAX_STR 10
  13. #define STR_LEN 101
  14. #define MAX_SIZE 1010
  15. char szBuffer[MAX_SIZE];
  16. int  iStateTable[MAX_STR][4] = {0};
  17. int (*piStateTable)[4] = iStateTable;
  18. char *pSzArray[MAX_STR] = {NULL};
  19. int iApplyCount = 0;
  20. int iNeedSpace = 0;
  21. int iSaveSpace = 0;
  22. void UpdateSz(char *[], int *, int);
  23. void SortSz(char *[], int );  
  24. void PrintSz(char *[], int );
  25. int AddSz(char *[], int *);
  26. int FoundSz(char *[], int , char *);
  27. int ReadLine(char *, int n);
  28. char *DeleteSz(char *[], int *, int);
  29. void MakeEmptySz(char *[], int *);
  30. void UpdateSz(char *[], int *, int);

  31. int main(int argc, char* argv[])
  32. {
  33.     int iCount = 0;
  34.     int i = 0;
  35.     int iFlag = 0;
  36.     for(;;)
  37.     {
  38.         printf("*************************输入命令****************************\r\n");
  39.         printf("*****<i>:添加数据 <s>:排序     <p>:显示数据 <f>:查找数据***** \r\n");
  40.         printf("*****<d>:删除数据 <x>:清空数据 <u>:更新数据 <q>:退出*********\r\n");
  41.         printf("*************************************************************\r\n");
  42.         printf(">");
  43.         iFlag = 0;   
  44.         char cCmd;
  45.         fflush(stdin);
  46.         cCmd = getchar();   
  47.         int iIsFound = 0;
  48.         int iDeleTeIndex = 0;
  49.         int iUpteIndex = 0;
  50.         switch(tolower(cCmd))
  51.         {
  52.         case 'u':
  53.             printf("输入要更新的数据:\r\n");
  54.             PrintSz(pSzArray, iCount);
  55.             if(iCount <= 0)
  56.             {
  57.                 break;
  58.             }
  59.             printf("序号: ");
  60.             scanf("%d", &iUpteIndex);
  61.             if(iUpteIndex >= 1 && iUpteIndex <= iCount)
  62.             {
  63.                 UpdateSz(pSzArray, &iCount, iUpteIndex);
  64.                 printf("更新完成, 当前数据为:\r\n");
  65.                 PrintSz(pSzArray, iCount);
  66.             }
  67.             else
  68.             {
  69.                 printf("你输入了错误的序号\r\n");
  70.             }
  71.             break;
  72.         case 'i':                  
  73.             AddSz(pSzArray, &iCount); //添加数据
  74.             break;
  75.         case 's':
  76.             SortSz(pSzArray, iCount); //排序
  77.             break;
  78.         case 'p':
  79.             PrintSz(pSzArray, iCount); //显示数据
  80.             break;
  81.         
  82.         case 'f':
  83.             iFlag = 1;
  84.             printf("输入要查找的数据:\r\n");
  85.             char szFound[STR_LEN];
  86.             ReadLine(szFound, STR_LEN);
  87.             iIsFound =  FoundSz(pSzArray, iCount, szFound); //查找数据
  88.             if(iIsFound)
  89.             {
  90.                 printf("找到了数据,第%d个,内容为:%s\r\n\r\n", iIsFound, szFound);
  91.             }
  92.             else
  93.             {
  94.                 printf("没找到\r\n");
  95.             }
  96.             break;     
  97.         case 'd':
  98.             printf("输入要删除第几个数据:\r\n");
  99.             PrintSz(pSzArray, iCount);
  100.             if(iCount <= 0)
  101.             {
  102.                 break;
  103.             }
  104.             printf("序号: ");
  105.             scanf("%d", &iDeleTeIndex);
  106.             if(iDeleTeIndex >= 1 && iDeleTeIndex <= iCount)
  107.             {
  108.                 printf("你删除了第%d个数据,内容为:%s\r\n", iDeleTeIndex, DeleteSz(pSzArray, &iCount, iDeleTeIndex));
  109.             }
  110.             else
  111.             {
  112.                 printf("你输入了错误的序号\r\n");
  113.             }
  114.             break;
  115.         case 'x':
  116.             MakeEmptySz(pSzArray, &iCount); //清空数据
  117.             printf("清空数据成功\r\n");
  118.             break;
  119.         case 'q':
  120.             printf("统计:\r\n");
  121.             printf("你一共申请了%d次空间\r\n", iApplyCount);
  122.             printf("使用了%d字节空间\r\n", iNeedSpace - iSaveSpace);
  123.             printf("节约了%d字节空间\r\n", iSaveSpace);
  124.             system("pause");
  125.             return 0;
  126.             break;
  127.         default:
  128.             printf("你输入了神秘指令\r\n");
  129.             break;
  130.         }
  131.     }      
  132.     return 0;   
  133. }



  134. int ReadLine(char str[], int n)
  135. {
  136.     int ch, i = 0;
  137.     fflush(stdin);
  138.     while (isspace(ch = getchar())) //忽略用户输入数据前面空格回车
  139.     {
  140.     }
  141.     while(ch != '\n')
  142.     {
  143.         if(i < n)
  144.         {
  145.             str[i++] = ch;
  146.         }
  147.         ch = getchar();
  148.     }
  149.     str[i] = '\0';
  150.     return i;
  151. }

  152. void SortSz(char *pSzArray[], int count)
  153. {
  154.     int i;
  155.     int j;
  156.     int iMinOffset = 0;
  157.     char *temp;
  158.     for(i = 0; i < count;  i++)
  159.     {
  160.         iMinOffset = i;
  161.         for(j = i + 1; j < count; j++)
  162.         {
  163.             if (strcmp(pSzArray[iMinOffset], pSzArray[j]) > 0)    /*记录最小字符串的坐标*/
  164.             {
  165.                 iMinOffset = j;
  166.             }
  167.         }
  168.         temp = pSzArray[i];                                 /*每次最小放最左边*/
  169.         pSzArray[i] = pSzArray[iMinOffset];
  170.         pSzArray[iMinOffset] = temp;
  171.     }
  172.     printf("排序完成\r\n");
  173. }

  174. void PrintSz(char *pSz[], int count)
  175. {
  176.     int i;
  177.     if (count == 0)
  178.     {
  179.         printf("没有数据,请先添加\r\n");
  180.         return;
  181.     }
  182.     else
  183.     {
  184.         printf("数据为:\n");
  185.         for(i = 0; i < count; i++)
  186.         {
  187.             printf("%-2d: %s\n", i + 1, pSz[i]);
  188.         }
  189.     }  
  190. }


  191. int AddSz(char *pSzArray[], int *count)
  192. {
  193.     int i = 0;
  194.     char szTemp[STR_LEN];      
  195.     printf("字符串排序最大支持长度为%d,最多%d个字符串 输入exit退出输入\r\n", STR_LEN - 1, MAX_STR);
  196.     for(;;)
  197.     {
  198.         int iFlag = 0;
  199.         if(*count == MAX_STR)
  200.         {
  201.             printf("最大%d个字符串\r\n", *count);
  202.             break;
  203.         }
  204.         printf("输入第%d个字符串: ", *count + 1);
  205.         ReadLine(szTemp, STR_LEN - 1);
  206.         if(strcmp(szTemp,"EXIT") == 0 || strcmp(szTemp,"exit") == 0)
  207.         {
  208.             break;
  209.         }
  210.         int szLen = strlen(szTemp) + 1;
  211.         int iTableCount = piStateTable - iStateTable;
  212.         int iLeftBufferLen = 0;
  213.         int j = 0;
  214.         for(i = j; i < iTableCount; i++) //从第一个table开始找位置
  215.         {   
  216.             iLeftBufferLen = 0;
  217.             j = i;
  218.             while(iStateTable[j][3] == 0)
  219.             {
  220.                 iLeftBufferLen += iStateTable[j][2];
  221.                 if (iLeftBufferLen >= szLen)
  222.                 {
  223.                     strcpy(szBuffer + iStateTable[i][1], szTemp);  //拷贝到缓冲区;
  224.                     pSzArray[*count] = szBuffer + iStateTable[i][1]; //指针指向缓冲区;
  225.                     iStateTable[i][3] = 1;  //置为忙
  226.                     iStateTable[i][2] = szLen; //长度
  227.                     iNeedSpace += szLen;
  228.                     iApplyCount++;
  229.                     iSaveSpace += szLen;
  230.                     iStateTable[i][0] = iApplyCount;
  231.                     j = i + 1;                  
  232.                     while(iStateTable[j][1] < iStateTable[j + 1][1]) //更新后面表格偏移和长度问题
  233.                     {
  234.                         iStateTable[j][1] = iStateTable[j - 1][1] + iStateTable[j - 1][2];
  235.                         if(iStateTable[j][1] > iStateTable[j + 1][1])
  236.                         {
  237.                             iStateTable[j][2]= 0;
  238.                         }
  239.                         else
  240.                         {
  241.                             iStateTable[j][2] = iStateTable[j + 1][1] - iStateTable[j][1];
  242.                         }
  243.                         j++;
  244.                     }
  245.                   
  246.                     iStateTable[j][1] = iStateTable[j - 1][1] + iStateTable[j - 1][2];                  
  247.                     iFlag = 1;
  248.                     (*count)++;     
  249.                     break;
  250.                 }
  251.                 j++;
  252.                 if(j >= iTableCount)
  253.                 {
  254.                     break;
  255.                 }
  256.             }
  257.             if (iFlag == 1)
  258.             {
  259.                 break;
  260.             }
  261.         }

  262.       
  263.         if(iFlag == 0)
  264.         {     
  265.             int offset;
  266.             if(*count == 0)
  267.             {
  268.                 offset = 0;
  269.             }
  270.             else
  271.             {
  272.                 offset = piStateTable[-1][1] + piStateTable[-1][2];
  273.             }
  274.             strcpy(szBuffer + offset , szTemp);
  275.             pSzArray[*count] = szBuffer + offset; //指向字符串地址
  276.             iApplyCount++;
  277.             (*piStateTable)[0] = iApplyCount; //第几个数据
  278.             (*piStateTable)[1] = offset; //距表格偏移
  279.             (*piStateTable)[2]= strlen(szTemp) + 1; //长度
  280.             iNeedSpace += strlen(szTemp) + 1;
  281.             (*piStateTable)[3] = 1; //是否空闲
  282.             piStateTable++;
  283.             (*count)++;
  284.         }
  285.   
  286.     }
  287.    
  288.     return *count;
  289. }

  290. /**********************************************************
  291. * 用于查找指定字符串                                      *
  292. * 参数1.指向字符串指针的数组                              *
  293. * 参数2.指向字符串指针的个数                              *
  294. * 参数3.指向要查找的字符串                                *
  295. *********************************************************/

  296. int FoundSz(char *pSzArray[], int count, char *pSz)
  297. {
  298.     int i = 0;
  299.     for(i = 0; i < count; i++)
  300.     {
  301.         if(strcmp(pSzArray[i], pSz) == 0)
  302.         {
  303.             return i + 1;
  304.         }
  305.     }
  306.     return 0;
  307. }

  308. /**********************************************************
  309. * 用于删除指定字符串                                      *
  310. * 参数1.指向字符串指针的数组                              *
  311. * 参数2.指向字符串指针的个数                              *
  312. * 参数3.指向要删除的字符串                                *
  313. *********************************************************/

  314. char *DeleteSz(char *pSzArray[], int *count, int iDeleteIndex)
  315. {
  316.     int i = 0;
  317.     char *szReTemp =  pSzArray[iDeleteIndex - 1];
  318.     iSaveSpace += strlen(pSzArray[iDeleteIndex - 1]) + 1;
  319.     for(i = 0; i <= piStateTable - iStateTable ; i++)
  320.     {
  321.         char *temp = szBuffer + iStateTable[i][1];
  322.         if (strcmp(pSzArray[iDeleteIndex - 1], temp) == 0)
  323.         {
  324.             break;
  325.         }
  326.     }
  327.     iStateTable[i][3] = 0;
  328.     for(i = iDeleteIndex - 1; i < *count; i++) //往左移
  329.     {
  330.         pSzArray[i] = pSzArray[i + 1];
  331.     }
  332.     pSzArray[*count] = NULL;    //多出指针填空

  333.     (*count)--;
  334.     return szReTemp;
  335. }

  336. void MakeEmptySz(char *pSzArray[], int *count)
  337. {
  338.     int i = 0, j = 0;
  339.     for(i = 0; i < *count; i++)
  340.     {
  341.         pSzArray[i] = NULL; //指针指向空
  342.     }
  343.     for(i = 0; i <= piStateTable - iStateTable; i++)
  344.     {
  345.         for(j = 1; j < 4; j++)
  346.         {
  347.              iStateTable[i][j] = 0; // 全部置0重新分配;
  348.         }
  349.     }
  350.     piStateTable = iStateTable;
  351.     *count = 0;
  352.     iSaveSpace += iNeedSpace - iSaveSpace;
  353. }


  354. void UpdateSz(char *pSzArray[], int *count, int iUpdateIndex)
  355. {
  356.     DeleteSz(pSzArray, count, iUpdateIndex);
  357.     printf("更新为:\r\n");
  358.     char szUpdate[MAX_STR];
  359.     ReadLine(szUpdate, MAX_STR - 1);
  360.     int szLen = strlen(szUpdate) + 1;
  361.     int iTableCount = piStateTable - iStateTable;
  362.     int iLeftBufferLen = 0;
  363.     int j = 0;
  364.     int i = 0;
  365.     int iFlag = 0;
  366.     for(i = j; i < iTableCount; i++) //从第一个table开始找位置
  367.     {   
  368.         iLeftBufferLen = 0;
  369.         j = i;
  370.         while(iStateTable[j][3] == 0)
  371.         {
  372.             iLeftBufferLen += iStateTable[j][2];
  373.             if (iLeftBufferLen >= szLen)
  374.             {
  375.                 strcpy(szBuffer + iStateTable[i][1], szUpdate);  //拷贝到缓冲区;
  376.                 pSzArray[*count] = szBuffer + iStateTable[i][1]; //指针指向缓冲区;
  377.                 iStateTable[i][3] = 1;  //置为忙
  378.                 iStateTable[i][2] = szLen; //长度
  379.                 iNeedSpace += szLen;
  380.                 iApplyCount++;
  381.                 iSaveSpace += szLen;
  382.                 iStateTable[i][0] = iApplyCount;
  383.                 j = i + 1;
  384.                 while(iStateTable[j][1] < iStateTable[j + 1][1])
  385.                 {
  386.                     iStateTable[j][1] = iStateTable[j - 1][1] + iStateTable[j - 1][2];
  387.                     if(iStateTable[j][1] > iStateTable[j + 1][1])
  388.                     {
  389.                         iStateTable[j][2]= 0;
  390.                     }
  391.                     else
  392.                     {
  393.                         iStateTable[j][2] = iStateTable[j + 1][1] - iStateTable[j][1];
  394.                     }
  395.                     j++;
  396.                 }
  397.                
  398.                 iStateTable[j][1] = iStateTable[j - 1][1] + iStateTable[j - 1][2];                  
  399.                 iFlag = 1;
  400.                 (*count)++;
  401.                
  402.                 break;
  403.             }
  404.             j++;
  405.             if(j >= iTableCount)
  406.             {
  407.                 break;
  408.             }
  409.         }
  410.         if (iFlag == 1)
  411.         {
  412.             break;
  413.         }
  414.         
  415.     }
  416.    
  417.    
  418.     if(iFlag == 0)
  419.     {
  420.         
  421.         int offset;
  422.         if(*count == 0)
  423.         {
  424.             offset = 0;
  425.         }
  426.         else
  427.         {
  428.             offset = piStateTable[-1][1] + piStateTable[-1][2];
  429.         }
  430.         strcpy(szBuffer + offset , szUpdate);
  431.         pSzArray[*count] = szBuffer + offset; //指向字符串地址
  432.         iApplyCount++;
  433.         (*piStateTable)[0] = iApplyCount; //第几个数据
  434.         (*piStateTable)[1] = offset; //距表格偏移
  435.         (*piStateTable)[2]= strlen(szUpdate) + 1; //长度
  436.         iNeedSpace += strlen(szUpdate) + 1;
  437.         (*piStateTable)[3] = 1; //是否空闲
  438.         piStateTable++;
  439.         (*count)++;
  440.     }
  441.    
  442.     char *szTemp = NULL;
  443.     szTemp = pSzArray[iUpdateIndex - 1];
  444.     pSzArray[iUpdateIndex - 1] = pSzArray[*count - 1];
  445.     pSzArray[*count - 1] = szTemp;
  446.     for(i = *count - 1; i > iUpdateIndex; i--)
  447.     {
  448.         szTemp = pSzArray[i];
  449.         pSzArray[i] = pSzArray[i - 1];
  450.         pSzArray[i - 1] = szTemp;
  451.     }
  452.    
  453.    

  454. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 17:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表