##练习
**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 );
}