C语言数组知识

本文深入探讨了C语言中数组与链表的基本操作,包括数组元素的循环输出、查找特定和值的元素、求最大值及次大值等。同时,详细介绍了链表的创建、遍历、加法运算、排序、节点删除以及重排等实用技能。通过具体实例和代码演示,帮助读者掌握关键数据结构操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//利用一重循环将一个数组输出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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值