习题

博客包含多个C语言编程练习,如实现memcpy函数功能,进行字符串逆序(含指针、递归、非递归方法),单链表逆序,求1 - 100内素数个数,句子逆序输出,以及用递归实现整数倒着输出等。

##练习
**1、原型:void *memcpy(void dest, const void src, size_t n);
功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中;
memcpy没有考虑重叠的情况

void* mymemcpy(void* dest, void* source, size_t count)
{
	char *ret = (char *)dest;
	char *dest_t = ret;
	char *source_t = (char *)source;
	while (count--)
	{
		*dest_t++ = *source_t++;
	}  
	return ret;
}      

2、通过编程,实现字符串逆序

(1)设置两个指针,分别指向字符串的头部和尾部,
然后交换两个指针所指的字符,并向中间移动指针直到交叉。

char* RevStr(char* s)
{
    char* p = s ; //p指向字符串头部
    char* q = s ; //q指向字符串尾部
    while( *q )  
    {	
	++q;
    }
        q--;
    while(q > p)
    {
        char t = *p ;
        *p++ = *q ;
        *q-- = t ;
    }
    return s ;
}

(2)用递归的方式,需要给定逆序的区间,
调用方法:RevStr(s, 0, strlen(s));

void RevStr( char* s, int left, int right )
{
    if(left >= right)
        return s ;
    char t = s[left] ;
    s[left] = s[right] ;
    s[right] = t ;
    Reverse(s, left + 1, right - 1) ;
}

(3)非递归法,同样指定逆序区间,
和方法一没有本质区别,一个使用指针,一个使用下标。

char* RevStr( char* s, int left, int right )
{
    while( left < right )
    {
        char t = s[left] ;
        s[left++] = s[right] ;
        s[right--] = t ;
    }
    return s ;
}

3、单链表逆序
功能:逆转链表,并返回逆转后的头结点,(给出单链表的结点结构)

typedef struct _node
{
     int data;
     struct _node * next;
}Node;
函数原型:Node* ReverseList(Node *head);

Node* ReverseList(Node *head)
{
    if(head == NULL || head->next == NULL)
    {
        return head;
    }
    Node *cur = head;
    Node *pre = NULL;
    Node *tmp;
    while(cur->next)
    {
        tmp = pre;
        pre = cur;
        cur = cur->next;
        pre->next = tmp; 
       //操作pre的next逆转
    }
       cur->next = pre; 
      //结束时,操作cur的next逆转
      return cur;
}

4、通过编程,求1-100以内的素数的个数;

#include<stdio.h>
#include<math.h>
//判断一个数是不是素数
int isPream(int n)  
{
	int temp = sqrt(n);       //开方
	//n除以2到根号n,不能整除就是素数;
	for(i=2;i<=temp;i++)
	{
	    if(n%i ==0) return 0;
	}
	return 1;
} 
void main()
{
	int n;
	for(n=2;n<=100;n++)
	{
		if(isPrime(n)) 
		printf("%d\t",n);
	}
	printf("\n");
}

5、通过编程,实现 I am from shanghai 逆序输出shanghai from am I;

(1)先单词逆序得到”I ma morf iahgnahs”
(2)再整个句子逆序得到”shanghai from am I”
// 对指针p和q之间的所有字符逆序

void ReverseWord(char* p, char* q)
{
    while(p < q)
    {
        char t = *p ;
        *p++ = *q ;
        *q-- = t ;
    }
}
// 将句子按单词逆序
char* ReverseSentence(char* s)
{
    char* p = s ; // 指向单词的首字符
    char* q = s ; // 指向空格或者 '\0'
    while(*q != '\0')
    {
        if (*q == ' ')
        {
            ReverseWord(p, q - 1) ;
            q++;//指向下一个单词首字符
        	p = q; 
        }
        else
            q++ ;
    }
    ReverseWord(p,q-1);//最后一个单词逆序
    ReverseWord(s,q-1);//对整个句子逆序
    return s ;
}

6、用C写一个输入的整数,倒着输出整数的函数,要求用递归方法;

void fun( int a )  
{  
    printf( "%d", a%10 );  
    a /= 10;  
    if( a <=0 )
        return;  
    fun( a );  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值