笔试编程题1

1,不用库函数实现strcpy,并说明strcpy返回char*的原因

为了实现链式表达式。 例如 int length = strlen( strcpy( strDest, “hello world”) );

/*将字符串s1复制到s2*/
char*
mystrcpy(char *s1, const char *s2) { if(s1==NULL || s2==NULL) return -1; char *r=s1; while((*s1++ = *s2++) != '\0'); return r; }

 

2,实现strcmp

int mystrcmp(const char *s1, const char *s2)
{
    while( (*str1==*str2) && (*str1 != '\0') )
    {
        str1++;
        str2++;
    }

    if(*str1 > *str2) return 1;
    else if(*str1 < *str2) return -1;
    else return 0;
}

 

3,实现strstr

/*查找字符串s1中字符串s2所在的位置*/
char
*mystrstr(const char *s1, const char* s2) { int i=0, j=0, temp=0; for(i=0; s1[i]!='\0'; i++) { temp = i; j = 0; while(s1[i++] ==s2[j++]) { if(s2[j] == '\0') return &s1[temp]; } i = temp; } return NULL; }

 

4,找出两个字符串的最大公共字符串

int GetCommon(char *s1, const char *s2, char **r)
{
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int maxlen = 0;
    int i=0, j=0;
    
    for(i=0; i<len1; i++)
    {
        for(j=0; j<len2; j++)
        {
            if(s2[i] == s2[j])
            {
                int as=i, bs=j,count=1;
                while((as+1<len1) && (bs+1<len2) && (s1[++as]==s2[++bs]))
                    count++;
                if(count>maxlen)
                {
                    maxlen = count;
                    *r = s1+1;
                }
            }
        }
    }
}

 

5,链表逆序

typedef struct node 
{
    struct node *next;
    int data;
}Node;

typedef struct queue
{
    Node *front; 
    Node *rear;
    int num;
}Queue;

int QueueReverse(Queue *queue)
{
    Node *node = queue->front;
    Node *nodeb;
    if(QueueIsEmpty(queue))
    {
        printf ("queue is empty\n");
        return -1;
    }

    queue->rear = queue->front;
    queue->front = NULL;

    while(node != NULL)
    {
        nodeb = node;
        node = node->next;
        nodeb->next = queue->front;
        queue->front = nodeb;
    }

    return 0;
}

 

6,判断链表是否有环

 

7,合并两个没有交集的有序链表 

typedef node
{
    int data;
    struct node *next;
}Node, *List;

//s1,s2没有头结点
List Mergelist_L(List s1, List s2)
{
    Node node = {0,NULL};
    Node *head = &node;   //head为合并后的头结点
    Node *rear = head;

    while( s1 && s2)
    {
        if(s1->data < s2->data)
        {
            rear->next = s1;
            rear = rear->next;
            s1 = s1->next;
        }
        else
        {
            rear->next = s2;
            rear = rear->next;
            s2 = s2->next;
        }
        rear->next = s1? s1:s2; //s1为空的话rear->next=s2
    }

    head = head->next;  //去掉头结点
    return head;
}

 

 

 

posted @ 2014-11-08 15:42  suo_suo  阅读(161)  评论(0编辑  收藏  举报