//利用一重循环将一个数组输出k圈
#include<stdio.h>
#define N 8
void print_k(int a[],int k)
{
int i;
for(i=0;i<k*N;i++){
printf("%d\t",a[i%N]);
if(i%N==N-1){
printf("\n");
}
}
}
int main()
{
int a[N]={3,2,5,8,4,7,6,9};
int k;
printf("请输入循环的圈数k的值:");
scanf("%d",&k);
print_k(a,k);
return 0;
}
//查找数据集合中一对和值为k的元素
#include<stdio.h>
#define N 8
int main()
{
int a[N]={3,2,5,8,4,7,6,9};
int i,j,k,flag=1;
printf("请输入k:");
scanf("%d",&k);
for(i=0;i<N&&flag;i++){
for(j=i+1;j<N;j++){
if(a[i]+a[j]==k){
flag=0;
}
}
}
flag==0?printf("有和值为%d的两个元素\n",k):printf("没有和值为%d的两个元素\n",k);
return 0;
}
//查找数据元素中的最大值
#include<stdio.h>
#define N 8
int find_max(int a[])
{
int i,max=0;
for(i=0;i<N;i++){
if(a[i]>a[max]){
max=i;
}
return max;
}
}
int main()
{
int a[N]={11,2,5,88,4,7,6,9};
int max;
max=find_max(a);
printf("数据集合的最大值是%d\n",a[max]);
return 0;
}
//求数据集合最大值与次大值
#include<stdio.h>
#define N 8
int main()
{
int a[N]={39,2,5,888,4,7,6,39};
int max=0,max_next=1;
for(int i=1;i<N;i++){
if(a[i]>a[max]){
max_next=max;
max=i;
}
else{
if(a[i]>a[max_next]){
max_next=i;
}
}
}
printf("该数组的最大值次大值分别是%d,%d",a[max],a[max_next]);
return 0;
}
//计算字符串的值
#include<stdio.h>
#define N 6666
double convert(char a[])
{
double sum=0;
double f,h=1;
int i,flag=0;
for(i=0;a[i]-'\0';i++){
if(a[i]!='.'&&!flag){
f=a[i]-'0';
sum=sum*10+f;
}
else{
if(a[i]=='.'){
flag=1;
}
else{
f=a[i]-'0';
h=h*0.1;
sum=sum+h*f;
}
}
}
return sum;
}
int main()
{
char a[N]="22220.456";
double b;
b=convert(a);
printf("%f",b);
return 0;
}
//求两个字符串的和
#include<stdio.h>
#include<string.h>
#define N 18
int print(char s1[],char s2[])
{
int i,j,k,t=1,sum=0;
for(i=strlen(s1)-1,j=strlen(s2)-1;i>=0||j>=0;i--,j--){
if(i>=0&&j>=0){
k=s1[i]+s2[j]-2*'0';
}
else{
i>=0?k=s1[i]-'0':k=s2[j]-'0';
}
sum=sum+k*t;
t=t*10;
}
return sum;
}
int main()
{
char s1[N],s2[N];
int sum;
gets(s1);
gets(s2);
sum=print(s1,s2);
printf("%d",sum);
return 0;
}
//任意输入一个正整数x,求二进制中1的个数
#include<stdio.h>
int find_cnt_1(int x)
{
int i,j,cnt=0;
do{
if(x%2==1){
cnt++;
}
x=x/2;
}while(x);
return cnt;
}
int main()
{
int x,cnt;
printf("Please enter your x:");
scanf("%d",&x);
cnt=find_cnt_1(x);
printf("在数字%d中1出现了%d次\n",x,cnt);
return 0;
}
//将一个字符串从中间截断,将前半段与后半段进行交换
#include<stdio.h>
#include<string.h>
#define N 100
void form_head_to_tail(char s[])
{
char t;
int i=0,loop;
loop=(strlen(s)+1)/2;
while(s[i+loop]){
t=s[i];
s[i]=s[i+loop];
s[i+loop]=t;
i++;
}
}
int main()
{
char s[N];
gets(s);
form_head_to_tail(s);
printf("输出交换后的数组:\n");
puts(s);
return 0;
}
/*
strcpy函数原型实现
*/
#include<stdio.h>
#include<string.h>
#define N 1001
void MY__STRCPY(char s2[],char s1[])
{
int i=0,j=0;
while(s2[j++]=s1[i++]);
}
int main()
{
char s1[N];
char s2[N];
gets(s1);
MY__STRCPY(s2,s1);
printf("输出复制后的字符串s2:");
puts(s2);
return 0;
}
//编程实现strcat函数
#include<stdio.h>
#include<string.h>
#define N 100
void STRCAT_(char s1[],char s2[])
{
int i=0,j=0;
for(i=0;s1[i];i++);
while(s1[i++]=s2[j++]);
}
int main()
{
char s1[N];
char s2[N];
//实现两个字符串相连
gets(s1);
gets(s2);
STRCAT_(s1,s2);
puts(s1);
return 0;
}
/*
实现字符串替换函数
*/
#include<stdio.h>
#include<string.h>
#define N 100
void complace(char s[],char complacel[],int complace_head,int complace_tail)
{
int i=0,j=0;
while(s[i]){
if(i>=complace_head-1&&i<=complace_tail-1){
s[i]=complacel[j++];
}
i++;
}
}
int main()
{
char s[N];
char complacel[N];
int complace_head,complace_tail;
gets(s);
gets(complacel);
printf("请输入开始位置与截止位置:");
scanf("%d%d",&complace_head,&complace_tail);
if((complace_tail-complace_head+1)==strlen(complacel))
complace(s,complacel,complace_head,complace_tail);
puts(s);
return 0;
}
//统计一个字符串中英文字符出现的次数
#include<stdio.h>
#include<string.h>
#define N 100
int cnt_A_Z(char s[])
{
int cnt=0;
for(int i=0;s[i];i++){
if(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z'){
cnt++;
}
}
return cnt;
}
int main()
{
char s[N];
int cnt;
gets(s);
cnt=cnt_A_Z(s);
printf("这个字符串中的字母有%d个",cnt);
return 0;
}
1.数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
示例:
输入:
[4,3,2,7,8,2,3,1]
输出:
[2,3]
#include<stdio.h>
#define N 15
void find_double(int a[])
{
int b[N];
int i,j,tail=0;
for(i=0;i<N;i++){
for(j=i+1;j<N;j++){
if(a[i]==a[j]){
b[tail++]=a[i];
printf("%d\t",b[tail-1]);
}
}
}
}
int main()
{
int a[N]={3,3,0,5,8,1,2,5,7,8,6,1,7,11,11};
find_double(a);
return 0;
}
/*2.两数相加
给出两个 非空 的链表用来表示两个非负的整数。
其中,它们各自的位数是按照 逆序 的方式存储的,
并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) +
(5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
*/
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct node{
int data;
struct node*next;
}ElemSN;
ElemSN *creatlink(int a[])
{
ElemSN *p,*head,*tail=NULL;
for(int i=0;i<N;i++){
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!tail){
head=tail=p;
}
else{
tail=tail->next=p;
}
}
return head;
}
void printlink(ElemSN*head){
for(ElemSN*p=head;p;p=p->next){
printf("%d\t",p->data);
}
}
ElemSN*add(ElemSN*head_a,ElemSN*head_b)
{
int t=0;
ElemSN*p,*q,*temp,*head,*tail=NULL;
for(p=head_a,q=head_b;p&&q;p=p->next,q=q->next){
temp=(ElemSN*)malloc(sizeof(ElemSN));
temp->data=(p->data+q->data)%10+t;
temp->next=NULL;
t=(p->data+q->data)/10;
if(!tail){
head=tail=temp;
}
else{
tail=tail->next=temp;
}
}
if(t){
temp=(ElemSN*)malloc(sizeof(ElemSN));
temp->data=t;
temp->next=NULL;
tail=tail->next=temp;
}
return head;
}
int number(ElemSN*head)
{
int t=1,sum=0;
for(ElemSN*p=head;p;p=p->next){
sum=sum+p->data*t;
t=t*10;
}
return sum;
}
int main()
{
int a[N]={1,3,5,7,5};
int b[N]={3,5,7,9,9};
int num;
ElemSN*head_a;
ElemSN*head_b;
ElemSN*sum_a_b;
//创建链表a,b
head_a=creatlink(a);
head_b=creatlink(b);
//将两个链表相加
sum_a_b=add(head_a,head_b);
//输出和链表
printlink(sum_a_b);
//将这个链表转化成数字
num=number(sum_a_b);
printf("这个链表所代表的数字是:%d",num);
return 0;
}
/*
统计字符串中每个字符出现的次数
*/
#include<stdio.h>
#include<string.h>
#define N 100
void count(char s[])
{
int cnt[256]={0};
for(int i=0;s[i];i++){
cnt[s[i]]++;
}
for(int i=0;i<256;i++){
if(cnt[i])
printf("字符%c出现了%d次\n",i,cnt[i]);
}
}
int main()
{
char s[N];
gets(s);
count(s);
return 0;
}
/*
判断一个正整数x是否为素数(质数)
素数:除了一和他本身以外没有其他的公因式
*/
#include<stdio.h>
int main()
{
for(int j=1;j<1000;j++){
int flag=1;
for(int i=2;i<j&&flag;i++){
if(!(j%i)){
flag=0;
}
}
if(flag==1)
printf("%d是质数\n",j);
else{
printf("%d不是质数\n",j);
}
}
return 0;
}
1.复读机(顺序表)
AumSmile说着“为所欲为,为所欲为”,Yipeng 把这句话重复了成了“为所欲为所欲为"。
他们感觉这样很有趣,现给你个字符串str ,将这个字符串以最小的长度重复n遍。
输入:
第一行有一个字符串,仅由小写字母组成,(0<str<=50)第二行有一一个正整数n表示要重复出现的次数
输出:
输出重复了n遍且最小长度的字符串
(0<n<=50)
样例输入:
abab
/*
复读机 顺序表
*/
#include<stdio.h>
#include<string.h>
#define N 1000
void s_n(char s[],int n)
{
char s2[1000];
int i,j,t=0,flag=1;
for(j=1;s[j]&&flag;j++){
if(s[0]==s[j+1]){
flag=0;
}
}
for(i=0;i<j*(n-1)+strlen(s);i++){
s2[t++]=s[i%j];
}
s2[t]=0;
for(i=0;s2[i];i++){
printf("%c",s2[i]);
}
}
int main()
{
char s[N];
gets(s);
int n;
printf("请输入你要重复的次数:");
scanf("%d",&n);
s_n(s,n);
return 0;
}
//
前边那个程序当输入aaab的时候会出现错误,进行改进
/*
复读机 顺序表
*/
#include<stdio.h>
#include<string.h>
#define N 1000
void s_n(char s[],int n)
{
char s2[1000];
int i,j,t=0,flag;
for(j=0;s[j];j++){
if(s[0]==s[j]){
flag=j;
}
}
printf("%d\n",flag);
j=flag;
for(i=0;i<j*(n-1)+strlen(s);i++){
s2[t++]=s[i%j];
}
s2[t]=0;
for(i=0;s2[i];i++){
printf("%c\t",s2[i]);
}
}
int main()
{
char s[N];
gets(s);
int n;
printf("请输入你要重复的次数:");
scanf("%d",&n);
s_n(s,n);
return 0;
}
2.分隔链表
题目描述:
给定一个链表和一个特定值x,对链表进行分隔,使得所有小于x的节点都在大于或等于x的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head =
1->4->3->2->5->2,x=3
输出:
1->2->2->4->3->5
当第一个数字大于x的时候会出现错误
#include<stdio.h>
#include<stdlib.h>
#define N 8
typedef struct node{
int data;
struct node*next;
}ElemSN;
ElemSN *creatlink(int a[])
{
ElemSN *p,*head,*tail=NULL;
for(int i=0;i<N;i++){
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!tail){
head=tail=p;
}
else{
tail=tail->next=p;
}
}
return head;
}
void printlink(ElemSN*head){
for(ElemSN*p=head;p;p=p->next){
printf("%d\t",p->data);
}
}
/*所有小于x的节点都在大于或等于x的节点之前。*/
ElemSN*sort(ElemSN*head,int x)
{
ElemSN*head_return,*p,*q,*t,*m;
int flag=0;
for(p=head;p;q=p,p=q->next){
if(p->data<x){
if(flag){
q->next=p->next;
p->next=NULL;
p->next=m;
t->next=p;
t=t->next;
m=t->next;
}
else{
t=p;
m=t->next;
}
}
else{
if(p->data>=x){
flag=1;
}
}
}
return head;
}
int main()
{
int a[N]={3,9,5,8,4,7,6,9};
ElemSN*head;
ElemSN*sort_head;
int x=7;
//创建链表
head=creatlink(a);
sort_head=sort(head,x);
printf("输出排序后的链表:");
printlink(sort_head);
return 0;
}
1.按奇偶排序数组
给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
提示:
1 <= A.length <= 5000
0 <= A[i] <= 5000
/*
按奇偶排序数组
将奇数放在偶数前面
*/
#include<stdio.h>
#define N 8
int* sort(int a[],int b[N])
{
int j=0;
for(int i=0;i<N*2;i++){
if(i<N&&a[i]%2){
b[j++]=a[i];
}
else if(i>=N&&!(a[i%N]%2)){
b[j++]=a[i%N];
}
}
return b;
}
int main()
{
int a[N]={3,2,5,8,4,7,6,9};
int b[N];
int i=0;
int *p=sort(a,b);
printf("输出排序后的数组");
while(i<N){
printf("%d\t",p[i++]);
}
return 0;
}
2.删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 – head = [4,5,1,9],它可以表示为:
示例 1:
输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
/*
2.删除链表中的节点
*/
#include<stdio.h>
#include<stdlib.h>
#define N 8
typedef struct node{
int data;
struct node*next;
}ElemSN;
ElemSN *creatlink(int a[])
{
ElemSN *p,*head,*tail=NULL
for(int i=0;i<N;i++){
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!tail){
head=tail=p;
}
else{
tail=tail->next=p;
}
}
return head;
}
void printlink(ElemSN*head){
for(ElemSN*p=head;p;p=p->next){
printf("%d\t",p->data);
}
}
void DEL(ElemSN*head,int node)
{
int flag=1;
for(ElemSN *p=head,*q;p&&flag;q=p,p=p->next){
if(p->data==node){
if(head==p){
head=0;
flag=0;
}
else{
q->next=p->next;
}
free(p);
flag=0;
}
}
}
int main()
{
int a[N]={3,2,5,8,4,7,6,9};
int node;
ElemSN*head,*head_next;
//创建链表
head=creatlink(a);
head_next=head->next;
printlink(head);
printf("\n请输入你要删除的节点:");
scanf("%d",&node);
//删除节点
DEL(head,node);
//输出链表
head->data==a[0]?head=head:head=head_next;
printlink(head);
return 0;
}
1.重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表
1->2->3->4, 重新排列为
1->4->2->3.
示例 2:
给定链表
1->2->3->4->5, 重新排列为
1->5->2->4->3.
给定一个正整数数组 nums。
#include<stdio.h>
#include<stdlib.h>
#define N 15
typedef struct node{
int data;
struct node*next;
}ElemSN;
ElemSN *creatlink(int a[])
{
ElemSN *p,*head,*tail=NULL;
for(int i=0;i<N;i++){
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!tail){
head=tail=p;
}
else{
tail=tail->next=p;
}
}
return head;
}
void printlink(ElemSN*head){
for(ElemSN*p=head;p;p=p->next){
printf("%d\t",p->data);
}
}
void inv_insert_printlink(ElemSN*head)
{
ElemSN*tail=NULL,*p,*q=NULL,*m=head->next,*n=head;
for(p=head;p->next;p=p->next);
tail=p;
while(m!=q){
for(p=head;p!=tail;q=p,p=p->next);
tail=q;
q->next=p->next;
//for(m=head,j=0;j<i;j++,n=m,m=m->next);
if(m==q){
q->next=NULL;
p->next=q;
n->next=p;
}
else{
p->next=m;
n->next=p;
n=p->next;
m=n->next;
}
}
}
int main()
{
int a[N];
for(int i=0;i<N;i++)
a[i]=i+1;
ElemSN*head;
//创建链表
head=creatlink(a);
printlink(head);
//逆序插入链表
inv_insert_printlink(head);
//输出插入后的链表
printf("\n");
printlink(head);
return 0;
}
//利用长短指针查找链表中间值节点
/*
用快慢指针找到链表中间节点
*/
#include<stdio.h>
#include<stdlib.h>
#define N 9
typedef struct node{
int data;
struct node*next;
}ElemSN;
ElemSN *creatlink(int a[])
{
ElemSN *p,*head,*tail=NULL;
for(int i=0;i<N;i++){
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!tail){
head=tail=p;
}
else{
tail=tail->next=p;
}
}
return head;
}
void printlink(ElemSN*head){
for(ElemSN*p=head;p;p=p->next){
printf("%d\t",p->data);
}
}
ElemSN*find_media_node(ElemSN*head)
{
ElemSN*p,*q;
for(p=q=head;p->next&&p->next->next;q=q->next,p=p->next->next);
return q;
}
int main()
{
int a[N]={3,2,5,8,4,7,6,9,11};
ElemSN*head,*p;
//创建链表
head=creatlink(a);
//查找链表的中间节点
p=find_media_node(head);
printf("链表中间节点的值时:%d",p->data);
return 0;
}