posts - 116,  comments - 34,  trackbacks - 0
http://topic.csdn.net/t/20040916/13/3378595.html
1将一个字符串逆序  
2将一个链表(linked   list)逆序  
3写计算一个字节(byte)里有多少bit被置1的函数
4在一个字符串中找到可能的最长的子字符串并返回之,该字符串是由同一字符组成的  
5字符串转换成整数   不用库函数
6整数转换成字符串   不用库函数

要求用纯C,时间复杂度和空间复杂度要好。
我先写一个1的:
char*   revch(char   *str)
{
char*   ps   =   NULL;
char*   p     =   str;
for(ps=str;   *ps!='\0';   ++ps);
for(--ps;   ps>p;   --ps,++p){
*p^=*ps;
*ps^=*p;
*p^=*ps;
}
return   str;
}

3
int   GetNum(   int   Num   )
{  
      int   i   =   0,LastNum   =   0;
      while(i<=7)
          Num&(2^i)   !=   0   ?   LastNum++   :   LastNum;
}

瞎写写
3.
int   GetNumofOne(unsigned   char   data)
{
    int   _res   =   0;
    while(data)
    {
        _res   +=   (data   &   1);
        data   >>   =   1;
    };
    return   _res;
}

5.
int   StrToInt(char*   s)
{    
    int   i   =   0,   fac   =   1;
    if(*s   =   '-'   ||   *s   =   '+')
    {
        fac   =   *s   ==   '-'   ?   -1   :   1;
        s++;
    }//if
    //不管溢出
    while(*s   >=   '1'   &&   *s   <=   '0')   i   =   i   *   10   +   (*s++   -   '0');
    return   fac   *   i;
}

3
int   GetNum(   unsigned   int   Num   )
{  
      int   nOne   =   0;
      while(Num)
      {  
            nOne   +=   (Num   &   1);
            Num   >>=   1;
        }
      return   nOne;
}

3
int   GetNum(unsigned   char   Num   )
{
    return   ((Num   &   1)  
              +     (Num   &   2)  
              +     (Num   &   4)
              +     (Num   &   8)
              +     (Num   &   0x10)
              +     (Num   &   0x20)
              +     (Num   &   0x40)
              +     (Num   &   0x80));
}

5
int   AtoI(const   char*   pData)
{
      int   flag   =   1;     //   正数
      int   result   =   0;
      if(pData   ==   0)
      {
          return   flag   *   result;
      }
      //   正负符号
      if(*pData   ==   '-')
      {
            flag   =   -1;
            pData++;
      }
      //   数值计算
      while(*pData)
      {
          if((*pData   <   '0')   ||   (*pData   >   '9'))
        {
              //   非法字符
              break;
          }
          result   *=   10;
          result   +=   (*pData   -   '0');
          pData++;
      }
      //   返回结果
      return   flag   *   result;
}

No.2好象还没有人写啊

struct   node{
              int       code;
              LinkList   *next;
}Node   *LinkList/*是对链表中节点的定义*/

LinkList     revers(LinkList   head)
{
/*链表的初始也省略了,只写关键部分*/

head=(LinkList   *)malloc(sizeof(LinkList));
/*用一个头指针指向这个链表*/

LinkList   *p,*q,*t;
q=head->next;
while(q){
t=q->next;
q->next=p;
p=q;
q=t;
}/*while*/
head->next==p;
return   head;
}
也没调试,大家一起来讨论吧

字符串转换成整数   标准C源代码:
   
int   atoi(const   char   *str)  
{
      return   (   (int)(   strtol   (str,   (char   **)   NULL,   10)   )   );
}/*   int   atoi(const   char   *str)   */

long   strtol(   const   char   *str,   char   **endptr,   int   base   )  
{
    unsigned   long   result;
    unsigned   long   stop;

    const   char   *cursor   =   str;
    int   i_char,   sign   =   0,   track,   threshold;

    do  
    {
        i_char   =   *cursor++;
    }   while   (   isspace(   i_char   &   0xff   )   );

    if   (   i_char   ==   '-'   )  
    {
        sign       =   1;
        i_char   =   *cursor++;
    }   else   if   (   i_char   ==   '+'   )  
    {
        i_char   =   *cursor++;
    }/*   end   of   if   else   */

    if   ((   base   ==   0   ||   base   ==   16   )   &&   (   i_char   ==   '0')
        &&   (   *cursor   ==   'x'   ||   *cursor   ==   'X'))  
    {
        i_char   =   cursor[1];
        cursor   +=   2;
        base   =   16;
    }/*   end   if   */

    if   (   base   ==   0   )
        base   =   (   (   i_char   ==   '0'   )   ?   8   :   10   );

    stop               =   (   sign   ?   (   -   (   unsigned   long   )LONG_MIN)   :   LONG_MAX   );
    threshold     =   (   stop   %   (   unsigned   long   )base   );
    stop             /=   (   unsigned   long   )base;

    result   =   0;   track   =   0;

    for   (   ;   ;   (   i_char   =   *cursor++   ),   (   i_char   &=   0xff   )   )  
    {
        if   (   isdigit(   i_char   )   )  
        {
            i_char   -=   '0';
        }   else   if   (   isalpha(   i_char   )   )  
        {
            i_char   -=   (   isupper(i_char)   ?   (   'A'   -   10   )   :   (   'a'   -   10   )   );
        }   else  
        {
            break;
        }/*   end   of   if   elseif   else   */

        if   (   i_char   >=   base   )
            break;

        if   (   (   track   <   0   )   ||   (   result   >   stop   )   ||  
            (   (   result   ==   stop   )   &&   (   i_char   >   threshold   )   ))  
        {
                track   =   -1;
            }   else  
        {
                track   =   1;
                result   *=   base;
                result   +=   i_char;
            }/*   end   of   if   else   */
    }/*   for   (   ;   ;   (   i_char   =   *cursor++   ),   (   i_char   &=   0xff   )   )   */

    if   (   track   <   0   )  
    {
        result   =   (   sign   ?   LONG_MIN   :   LONG_MAX   );
        errno     =   ERANGE;
    }   else   if   (   sign   )  
    {
        result   =   -result;
    }

    if   (   endptr   !=   0   )
        *endptr   =   (   track   ?   (   fixit(   cursor,   char   *   )   -   1   )   :  
                                fixit(   str,   char   *   )   );

    return   result;
}/*   long   strtol(   const   char   *str,   char   **endptr,   int   base   )     */

char   *itoa   (   int   value,   char   *string,   int   radix   )
{
    char   tmp[   33   ];
    char   *tp   =   tmp,   *sp,   r[   33   ];
    int   i,   sign;
    unsigned   v;

                if(   radix   >   36   ||   radix   <=   1   )
                    return   0;

                sign   =   (   radix   ==   10   &&   value   <   0   );
                if(   sign   )
                    v   =   -value;
                else
                    v   =   (unsigned)   value;

                while(   v   ||   tp   ==   tmp   )   {
                    i   =   v   %   radix;
                    v   =   v   /   radix;
                    if(   i   <   10   )
                        *tp++   =   i   +   '0';
                    else
                        *tp++   =   i   +   'a'   -   10;
                }

                if(   string   ==   0   )
                    string   =   (char   *)r;

                sp   =   string;

                if(   sign   )
                    *sp++   =   'a';

                while(   tp   >   tmp   )
                    *sp++   =   *--tp;

                *sp   =   0;
    return   string;
}

找子串的,
但是有缺陷,
如果有多个最大长度的,只能找出其中最后的一个
#include   <iostream.h>
#include   <string.h>
int   Test(char*   src,char   &c   )
{
int   max   =   1;
c   =   src[0];
for(int   i=1,begin=0,end   =0;i<(int)strlen(src);   i++)
{
if(src[i]==src[i-1])  
end   =   i;
else
begin   =   end   =   i;
int   len   =   end   -   begin   +   1;
if(max   <=   len)
{
c   =   src[i];
max   =   len;
}
}
return   max;
}

void     main()
{
char   c;
cout<<Test("baaccccac",c);
cout<<c;
}
posted on 2006-02-22 11:58 萌芽的叶子 阅读(263) 评论(0)  编辑 收藏 引用 所属分类: 生活点点嘀嘀
只有注册用户登录后才能发表评论。

<2006年4月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用链接

留言簿(3)

随笔分类(115)

随笔档案(116)

文章分类(4)

相册

收藏夹(78)

.net中文社区

.net博客

.net英文社区

AJAX

ASP.NET 2.0

ASP.NET 学习

DataBase

ERP

E杂志

Html&Css

JavaScript

Microsoft

Open Sourse

SAP

WebCasts

WebServices

XML

其他

好友Blog

好文章连接

开发工具

控件

物流

职业经理人

设计模式

读书网站

非技术

项目管理

搜索

  •  

积分与排名

  • 积分 - 58436
  • 排名 - 106

最新评论

阅读排行榜

评论排行榜