第七讲(二):双指针,指针运用
前言:前面讲的指针函数的内容有问题,现在已经改正。
1 指针运用:
例题1-1(字符串逆序)
(多组输入)写一个函数,可以逆序一个字符串的内容。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void Reverse_char(char* p, int end)
{
char* right = p+end-1;
char* left = p;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
Print_char(char arr[], int num)
{
printf("%s", arr);
}
int main()
{
char arr[100] = { 0 };
while (gets(arr) != EOF)
{
size_t num = strlen(arr);
Reverse_char(arr,num);
Print_char(arr, num);
}
return 0;
}
例题1-2:字符串左旋
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
方法1:一个一个旋
void Rotate_char(char* p, int len,int n)//核心函数代码
{
n = n % len;
for (int i = 0; i < n; i++)
{
int j = 0;
char tmp = p[0];
for (j = 0; j < len - 1; j++)
{
p[j] = p[j + 1];
}
p[j] = tmp;
}
}
void Print_char(char* p)
{
printf("%s\n",p);
}
int main()
{
char arr[100] = { 0 };
printf("输入字符串:");
while (gets(arr) != EOF)
{
int n = 0;
printf("输入左旋次数:");
scanf("%d", &n);
int len = strlen(arr);
Rotate_char(arr,len,n);
Print_char(arr);
}
return 0;
}
方法2:先逆置的前面的左旋次数的字符,然后再逆置后面,最后逆置整个字符串。
为什么要这样呢?
先举个例子:ABCDEFG假设左旋3个字符得到DEFGABC
我们的思路就是A和E换了,B和F换了,C和G换了。
那么我们怎么做呢?
我们想到的方法是逆置字符串
首先我们肯定要把前面3个字符逆置了,才能把C的位置换到首位
然后A的位置换到C的位置,接着肯定是要逆置后面4个字符的,(为了把D和A换了,E和B换了,A和F换了)逆置后面四个得到了
CBAGFED,你再逆置整个字符串是不是得到GDEFGABC。
代码如下:
void Reverse_char(char* p, int time)
{
char* right = p+time-1;
char* left = p;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void Print_char(char* p)
{
printf("%s\n",p);
}
int main()
{
//ABCDEFG->左旋3个 ->逆置前面3个 CBA DEFG
//->CBA GFDE
char arr[50] = { 0 };
while (gets(arr)!=EOF)
{
int len = strlen(arr);
int n = 0;
printf("输入左旋次数:");
scanf("%d", &n);
Reverse_char(&arr[0], n);
Reverse_char(&arr[n], len-n);
Reverse_char(&arr[0], len);
Print_char(arr);
}
return 0;
}
2 双指针的运用(相当于最左边一个指针,最右边一个指针进行类似窗口滑动的操作)
题目:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分
void Sort_odd_ou(int arr[], int n)
{
int left = 0;
int right = n-1;
while (left < right)
{
while (arr[left] % 2 == 1 && left < right)
{
left++;
}
while (arr[right] % 2 == 0 && left < right)
{
right--;
}
if (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
void Print_arr(int arr[], int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
}
void Scanf_arr(int arr[],int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d",&arr[i]);
}
}
int main()
{
int n = 0;
int arr[100] = { 0 };
printf("请输入数组的元素个数:");
scanf("%d", &n);
Scanf_arr(arr, n);
Sort_odd_ou(arr,n);
Print_arr(arr, n);
return 0;
}