用指针方法解决,输入一个字符串,删除字符串中所有空格后,输出字符串
#include
void removeSpace(char *s)
{
_______________________
}
int main()
{
char s[81];
gets(s);
removeSpace(s);
printf("%s", s);
return 0;
}
一行字符,以换行回车结束,最多不超过80个字符
删除所有空格后输出
abc 456
abc456
#include
void removeSpace(char *s)
{
int i=0;
while(s[i]!='\0'){
if(s[i]==' '){
for(int j=i; s[j]!='\0'; j++){
s[j]=s[j+1];
}
}
else i++; //只有不是空格才能+1,防止多个空格并列
}
}
int main()
{
char s[81];
gets(s);
removeSpace(s);
printf("%s", s);
return 0;
}
$block1$
int i=0,j=0;
while(s[j]!='\0')
{
if(s[j]==' ') j++;
else
s[i++]=s[j++];
}
s[i]='\0';
$end1$
标程很巧妙,使用了两个下标,注意辨析 i++ 和 ++i 的区别
输入10个整数,把其中最小的数与第一个数交换,最大的数与最后一个数交换。使用3个函数解决问题:
(1) 输入10个整数的函数
(2) 进行交换处理的函数
(3) 输出10个数的函数
#include
void input(int a[])
{
_______________________
}
void swap(int a[])
{
_______________________
}
void display(int a[])
{
int i;
for(i=0; i<10; i++)
printf("%d\n", a[i]);
}
int main()
{
int a[10];
input(a);
printf("input done\n");
swap(a);
printf("swap done\n");
display(a);
printf("display done\n");
return 0;
}
输入10个整数
输出结果,一行一个数字
2 1 3 4 5 6 7 8 9 0
input done
swap done
0
1
3
4
5
6
7
8
2
9
display done
#include
void input(int a[]) //输入10个整数的函数
{
for(int i=0; i<10; i++){
scanf("%d",&a[i]);
}
}
void swap(int a[]) //进行交换处理的函数
{
int max=0,min=999,tmp;
for(int i=0; i<10; i++){
if(a[i]>max)max=i;
if(a[i]<min)min=i; //牛逼,天天写bug
}
tmp=a[0];
a[0]=a[max];
a[max]=tmp;
tmp=a[9];
a[9]=a[min];
a[min]=tmp;
}
void display(int a[])
{
int i;
for(i=0; i<10; i++)
printf("%d\n", a[i]);
}
int main()
{
int a[10];
input(a);
printf("input done\n");
swap(a);
printf("swap done\n");
display(a);
printf("display done\n");
return 0;
}
$block1$
int i;
for(i=0; i<10; i++)
scanf("%d", &a[i]);
$end1$
$block2$
int temp,mini,maxi;
int i;
mini=0;
for(i=1; i<10; i++)
if(a[mini]>a[i])
mini=i;
temp=a[mini];a[mini]=a[0];a[0]=temp;
maxi=0;
for(i=1; i<10; i++)
if(a[maxi]<a[i])
maxi=i;
temp=a[maxi];a[maxi]=a[9];a[9]=temp;
$end2$
看了标程发现这题OJ误判了,写了一堆BUG居然过了,震惊,OJ应该只判断一次
输入一个4*4的二维整型数组,使用指针变量查找并输出二维整型数组中每一行的最大值。
#include
void find(int a[][4])
{
int (*p)[4], *q, *max;
for(_______________________)
{
max=*p;
for(_______________________)
{
_______________________
}
printf("%d\n", *max);
}
}
int main()
{
int a[4][4],i,j;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
scanf("%d", &a[i][j]);
find(a);
return 0;
}
4*4的整数矩阵
每行最大值,一行一个
1 2 3 4
8 7 6 5
1 1 1 1
2 2 2 2
4
8
1
2
#include
void find(int a[][4])
{
int (*p)[4], *q, *max;
for(p=a;p<a+4;p++) //每行首地址,这里的a是一行4个变量的地址集合
{
max=*p; //p为当前行4个地址集合,*p取到的是第一个元素的地址
for(q=*p;q<*p+4;q++) //q为当前行第一个元素地址,每次加一访问到每个元素
{
if(*q>*max){ //如果元素值>擂主值
max=q; //将该元素的地址赋值给max
}
}
printf("%d\n", *max); //输出max
}
}
int main()
{
int a[4][4],i,j;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
scanf("%d", &a[i][j]);
find(a);
return 0;
}
二维数组的指针需强化
有n个人围成一圈,从第1个人开始报数1、2、3,每报到3的人退出圈子。编程使用链表找出最后留下的人。
输入一个数n,1000000>=n>0
输出最后留下的人的编号
3
2
#include
#include
typedef struct people
{
int id; //数据域
struct people *next; //指针域
} LinkList;
int main()
{
int n, i;
scanf("%d", &n);
LinkList *head, *node, *end; //定义头节点,普通节点,尾部节点;
head = (LinkList *)malloc(sizeof(LinkList)); //分配空间
head->id = 1; //头节点
head->next = NULL;
end = head; //空链表头等于尾部
for (i = 2; i <= n; ++i){ //创建普通节点
node = (LinkList *)malloc(sizeof(LinkList));
node->id = i; //对应ID
end->next = node; //第一次运行时此处r为头节点地址,所以将p的指针域指向第一个s
end = end->next; //将r向后移
}
end->next = head; //本题特殊的地方,因为题目是个圈,所以要回到开头!!
int num = 0;
while (n > 1){ //循环到只剩一个人
if (head->id != 0){ //如果头节点不等于0
num++; //报数号
if (num % 3 == 0){ //如果报到3
n--;
head->id = 0; //将id设为0表示已经踢出,这里是网上一个人的方法
}
head = head->next; //下一个
}
else head = head->next; //如果头节点为0则跳过,不用报数
}
while (!head->id)head = head->next; //如果id为0则是已经被踢出的
printf("%d", head->id);
return 0;
}
#include
int c[1000000];
int main()
{
int i, j, n, pre, cur;
scanf("%d", &n);
if(n==1) printf("1\n");
else
{
for(i=0; i<n-1; i++) c[i]=i+1;
c[n-1]=0;
cur=n-1;
for(i=0; i<n-1; i++)
{
for(j=0; j<3; j++)
{
pre = cur;
cur=c[cur];
}
c[pre]=c[cur];
}
printf("%d", pre+1);
}
return 0;
}
…看完标程,脑瘫竟是我自己
已知有两个链表a和b,结点类型相同,均包括一个int类型的数据。编程把两个链表合并成一个,结点按升序排列。
#include "stdio.h"
#include "malloc.h"
#define LEN sizeof(struct DATA)
struct DATA
{
long num;
struct DATA *next;
};
struct DATA *create(int n)
{
struct DATA *head=NULL,*p1=NULL,*p2=NULL;
int i;
for(i=1;i<=n;i++)
{ p1=(struct DATA *)malloc(LEN);
scanf("%ld",&p1->num);
p1->next=NULL;
if(i==1) head=p1;
else p2->next=p1;
p2=p1;
}
return(head);
}
struct DATA *merge(struct DATA *head, struct DATA *head2)
{
_______________________
return head;
}
struct DATA *insert(struct DATA *head, struct DATA *d)
{
_______________________
return head;
}
struct DATA *sort(struct DATA *head)
{
_______________________
return head;
}
void print(struct DATA *head)
{
struct DATA *p;
p=head;
while(p!=NULL)
{
printf("%ld",p->num);
p=p->next;
printf("\n");
}
}
main()
{
struct DATA *head, *head2;
int n;
long del_num;
scanf("%d",&n);
head=create(n);
scanf("%d",&n);
head2=create(n);
head = merge(head, head2);
head = sort(head);
print(head);
}
第一行一个数n,表示第一个列表的数据个数
每二行为n个数
第三行为一个数m
第四行为m个数
输出合并后的有序的数据,一行一个数
2
4 8
3
9 1 5
1
4
5
8
9
#include "stdio.h"
#include "malloc.h"
#define LEN sizeof(struct DATA)
struct DATA
{
long num;
struct DATA *next;
};
struct DATA *create(int n)
{
struct DATA *head=NULL,*p1=NULL,*p2=NULL;
int i;
for(i=1;i<=n;i++)
{ p1=(struct DATA *)malloc(LEN);
scanf("%ld",&p1->num);
p1->next=NULL;
if(i==1) head=p1;
else p2->next=p1;
p2=p1;
}
return(head);
}
struct DATA *merge(struct DATA *head, struct DATA *head2) //合并
{
struct DATA *tmp;
tmp=head;
while(tmp->next!=NULL)tmp=tmp->next;
tmp->next=head2;
return head;
}
struct DATA *insert(struct DATA *head, struct DATA *d) //插入
{
struct DATA *old,*element,*tmp;
old = head;
element = d;
if(head==NULL){ //若被插入的链表为空
head=element;
element->next=NULL;
}
else{
while((element->num > old->num) && (old->next != NULL)){ //循环到找到比要插入元素大的位置
tmp=old; //前驱
old=old->next; //向后推进
}
if(element->num <= old->num){ //中间
if(head==old)head=element; //第一个
else tmp->next=element; //遍历到的元素的前驱元素指向插入元素
element->next=old; //要插入元素的下一个等于当前遍历到的元素
}
else{
old->next=element;element->next=NULL; //最后一个
}
}
return head;
}
struct DATA *sort(struct DATA *head) //排序
{
struct DATA *p1,*p2;
p2=head;p1=head;
p2=p2->next;
p1->next=NULL;
p1=p2;
while(p2->next!=NULL)
{
p2=p2->next;
p1->next=NULL;
head=insert(head,p1);
p1=p2;
}
head=insert(head,p1);
return head;
}
void print(struct DATA *head)
{
struct DATA *p;
p=head;
while(p!=NULL)
{
printf("%ld",p->num);
p=p->next;
printf("\n");
}
}
main()
{
struct DATA *head, *head2;
int n;
long del_num;
scanf("%d",&n);
head=create(n);
scanf("%d",&n);
head2=create(n);
head = merge(head, head2);
head = sort(head);
print(head);
}
参考标程