课外闲谈2.常用操作总结

简介: 随机输入字符串,最常见的操作就是用while,定义一个特殊的条件,例如while((ch=getchar())!=‘\n’);这样的话,结束标志就是回车键,并且,回车键不会被算入在内。

1.有序表插入删除操作


//定位,找到待插入的位置,即退出循环时i的位置
  for (i = 0; i < count; i++) {
    if (value < a[i]) {
      break;
    }
  }//升序排列
  //腾位:将a[i]~a[count-1]向后顺移一位
  for (j = count - 1; j >= i; j--) {
    a[j + 1] = a[j];
  }
  a[i] = value;//将value的值赋给a[i]
  count++;//数组待处理的元素数量加1


//定位:如果找到待删除的元素,用index记录其下标
  for (i = 0; i < count; i++) {
    if (value == a[i]) {
      index = i;
      break;
    } 
  }
  //没找到
  if (index == -1) {
    printf("Failed to find the date,deletion failed.");
  }
  //找到,删除a[index],并且将之后的所有元素向前挪一位
  else {
    for (i = index; i < count - 1; i++) {
      a[i] = a[i + 1];
    }
  }
  //待处理的元素数量减1
  count--;


2.随机输入字符串,最常见的操作就是用while,定义一个特殊的条件,例如while((ch=getchar())!=‘\n’);这样的话,结束标志就是回车键,并且,回车键不会被算入在内。


3.直接插入排序中,需要定义一个工作单元,就类似于交换两个元素的值里面要定义一个temp的作用类似。


#define _CRT_SECURE_NO_WARNINGS 1
//在有序数组中插入一个元素,并且插入过后同样是有序的。
#include<stdio.h>
int main() {
  //a[0]为工作单元,从a[1]开始存放数据。
  int a[10] = { 0,1,2,3,4,6,7};
  //j代表元素个数
  int x, i, j = 6;
  //输入插入的值
  printf("Enter a number:");
  scanf("%d", &x);
  //把x要放在数组中,避免数据的丢失。
  a[0] = x;
  //可以选择从大往小,也可以选择从小往大。我这里是从大往小。
  i = j;
  while (a[i] > x) {
    a[i + 1] = a[i];
    i--;
  }
  //把x放到比他小的值后面一位,因为上面已经把它的后面一位空出来了,所以,这个操作不会对数组内的数据有影响
  a[++i] = x;
  //插入x后,元素总个数增加。
  j++;
  //输出数组,从1开始,因为0是工作单元
  for (i = 1; i <= j; i++)
    printf("%8d", a[i]);
  printf("\n");
  return 0;
}


4.取地址字符串的操作,取出来的是字符串首元素的地址,解引用得到的就是首字符。


5.如果程序中有除法操作,要专门写一个if语句,用来判断分母为0的情况。


6.一个数每除以10,就会少一位,每%10,就会得到最后一位的数。


7.数学问题求答案时,可以写一个循环,将判断条件置为真,然后根据遍历所有的整数,来得到答案


#include<stdio.h>
int main(){
  int n;
  for(n=1;;n++)//本题要的就是n,故对n无限制条件{
  if((n%5==0)&&(n%6==5)&&(n%7==4)&&(n%11==10))
  {
    printf("%d",n);
    break;
  }
} 
  return 0;
} 


8.字符移动


  for(i=0;i<3;i++){
    a[i]=s[i];
  }
  for(i=3;s[i];i++){
    s[i-3]=s[i];
  }
  for(j=i-3,i=0;i<3;i++){
    s[j++]=a[i];
  }


for(int i=0;i<len;i++)
  s[i]=temp[(i+3) % len];//数组左移都能用这套。


9.含静态变量的函数反复调用(这个是比较重要的,但是见到的机会可能会比较少)


#include<stdio.h>
double fact_s(int n);
int main(){
  int i,n;
  printf("Input n:");
  scanf("%d",&n);
  for(i=1;i<=n;i++){
    printf("%3d!=%.0f\n",i,fact_s(i));//1.
  }
  return 0;
}
double fact_s(int n){
  static double f=1;
  f*=n;
  return f;
}
/*1处,在循环处,反复调用函数,第一次调用后,第二次调用时,第一次中的f空间被释放,第二次的f会重新赋值为一
但此处加了static,f放到了静态区,f的值在main函数结束前,并未被释放*/ 


10.要学会使用递归


//递归 
#include<stdio.h>
#include<string.h>
int judge(int low,int high,char *arr,int len){
  //最终条件。
  if(len==0 || len==1) 
    return 1;
  if(arr[low]!=arr[high])
    return 0;
  return judge(low+1,high-1,arr,len-2);
}
int main(){
  char arr[10]="aaabbaaa";
  int len=strlen(arr);
  if(judge(0,len-1,arr,len))
  printf("是!");
  else
  printf("不是!"); 
  return 0;
} 
/*递归的作用在于把问题的规模不断缩少,直到问题缩少到简单地解决 
通过观察可以知道,一个回文字符串其中内部也是回文。所以,我们只需要以去掉两端的字符的形式一层层检查,
每一次的检查都去掉了两个字符,这样就达到了缩少问题规模的目的。
1. 字符串长度可能会奇数或偶数:
如果字符串长度是奇数,字符串会剩下最中间那位字符,但其不影响回文。当检查到长度为1的时候即代表此字符串是回文
如果字符串长度是偶数,当两端的字符串两两比较检查后不会剩下字符。即检查到长度为0的时候即代表此字符串是回文
2. 如果检查到两端两个字符不相同。则说明此字符串不是回文,直接返回0,不需要继续检查


void print(unsigned int num ){
  //递归 
  if(n>9){
    print(n/10);
  }//反复调用此自定义函数,直到n<=9,首先输出n<=9时的数,因为n<=9时函数最先调用完,其次就是它的上一层调用,妙呀 
  printf("%d",n%10);
  //数组 
}
#include<stdio.h>
int main(){
  unsigned int num=0; 
  scanf("%u",&num);
  print(num);
  return 0;
} 


#include<stdio.h>
#include<math.h>
int main(){
  double fact(double x,int n);
  int n;
  float x;
  printf("请输入x,n:");
  scanf("%f%d",&x,&n);
  printf("%.2f",fact(x,n));
  return 0;
}
double fact(double x,int n){
  if(n==0)
  return 1;
  else
  return fact(x,n-1)*x;
}


11.大小写英文字母转换


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
  char ch;
  printf("Input characters:");
  ch = getchar();
  while (ch != '\n') {
    if (ch >= 65 && ch <= 90)
      ch = ch - 'A' + 'a';
    else if (ch >= 97 && ch <= 122) {
      ch = ch - 'a' + 'A';
    }
    putchar(ch);
    ch = getchar();
  }
  return 0;
}


12.结构体排序(选择排序)


//这里与已知长度和数据的数组的选择法排序不同,这里数据都是未知的。
  for (i = 1; i <= n; i++) {
    printf("NO.%d:",i);
    scanf("%d%s%d%d%d",&stu.num,stu.name,&stu.math,&stu.english,&stu.computer);
    stu.average = (stu.math + stu.english + stu.computer) / 3.0;
    if (i == 1) {
      max = stu;
    }
    else if (max.average < stu.average)
      max = stu;
  }


13.链表的增删查操作


//insert
struct node *insert(struct node* head,struct node* p,int x){
  struct node *k;
  k=(struct node*)calloc(1,sizeof(struct node));
  k->date=x;  
  //判断head指向的是不是空链表 
  if(!head){
    //既是第一个结点,也是最后一个结点 
    head=k;
    head->next=NULL;
  }
  else{
    //在中间的某个位置 
    k->next=p->next;
    p->next=k;
  }
  return head;
} 


//delete
struct node *delete(struct node* head,struct node* p){
  struct node *q;
  //如果p为空,则不做处理 
  if(!p)
    return head;
  //如果p是第一个结点,删除第一个结点 
  if(p==head)
    head=head->next;//就是把第二个结点的地址当成第一个 
  else{
    //如果p不是第一个结点,令q指向第一个结点 
    q=head;
    //向后一直找,找到后删除。 
    while(q->next!=p)
      q=q->next;
    q->next=p->next;
  }
  //结点删除的流程
  //1.删去地址
  //2.释放空间 
  free(p);
  return head;
} 


//find
struct node *find(struct node* head,int m){
  struct node *p=head;
  while(p && p->date!=m)
  p=p->next;
  if(!p)
    return NULL;//没找到 
  else
    return p;//找到了就返回地址 
} 


14.


#define _CRT_SECURE_NO_WARNINGS 1
//建立链表,查找值为x的结点并删除这个结点,x的值从键盘输入。
#include<stdio.h>
#include<stdlib.h>
//先定义结构体类型
struct node {
  int date;
  struct node* next;
};
//函数声明
struct node* create_number(int);
struct node* find(struct node *, int);
struct node* Delete(struct node *, struct node * );
void out_list(struct node*);
int main() {
  //建议还是初始化一下
  struct node* head=NULL, * p=NULL;
  int n, x;
  n = x = 0;
  printf("Create List,Enter n:");
  scanf("%d", &n);
  head = create_number(n);
  printf("List:");
    out_list(head);
  printf("x:");
    scanf("%d", &x);
    p = find(head, x);
    head = Delete(head, p);
    printf("Result:");
    out_list(head);
  return 0;
}
//创造结点的函数
struct node* create_number(int n) {//n代表准备创造结点的个数
  //创造结点时,至少需要三个指针变量,head固定在首结点,p和k用于创造新结点
  int i;
  struct node* head=NULL, * k=NULL, * p=NULL;
  if (n < 1) {
    return NULL;
  }
  else {
    k = (struct node*)malloc(sizeof(struct node));
    //判断是否申请成功
    if (!k)
      exit(1);
    k->date = 1;//初始化第一个数据
    //第一个结点,也是最后一个,这个操作相当于给指针域初始化
    k->next = NULL;
    head = k;
    p = k;
    for (i = 2; i <= n; i++) {
      k = (struct node*)malloc(sizeof(struct node));
      if (!k)
        exit(1);
      k->date = i;
      //初始化
      k->next = NULL;
      p->next = k;
      p = k;
    }
    return head;
  }
}
//查找函数
struct node* find(struct node* head, int x) {//头指针和待查找的元素
  //另外定义一个指针去遍历,从而保证head指针不被改变
  struct node* p = head;
  while (p && p->date != x) {
    p = p->next;
  }
  if (!p)
    return NULL;
  else
    return p;
}
//删除函数
struct node* Delete(struct node* head, struct node* p) {
  struct node* q;
  if (!p)
    return head;
  //如果p不为空,判断p指向结点的位置,从而进行删除操作
  if (p = head)
    head = head->next;
  else {
    q = head;
    while (q->next != p)
      q = q->next;
    q->next = p->next;
  }
  //别忘了释放空间
  free(p);
  return head;
}
//输出函数
void out_list(struct node* head) {
  //另外定义变量去遍历
  struct node* p;
  if (!head) {
    p = head;
    while (!p) {
      printf("%d", p->date);
      p = p->next;
    }
  }
  else
    printf("不存在\n");
  putchar('\n');
}


15.


//getchar调出换行符
#include<stdio.h>
int main(){
  int digit,i,letter,n,other;
  char ch;
  digit=letter=other=0;
  printf("请输入n:");
  scanf("%d",&n);
  getchar();
  printf("请输入%d个字符:",n);
  for(i=1;i<=n;i++)
  {
  ch=getchar();
  if(ch>=48 && ch<=57)
  digit++;
  else if((ch>=65 && ch<=80)||(ch>=97 && ch<=122))
  letter++;
  else
  other++;}
  printf("digit=%d,letter=%d,other=%d",digit,letter,other);
  return 0;
}


先就这些吧,以后有了再补。

目录
相关文章
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 人工智能 算法
2024重生之回溯数据结构与算法系列学习(7)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人数据结构与算法系列学习之队列的基本概念、如何判断队列已满/已空、队列的链式存储结构[头的出入队]、双端队列、中缀、后缀、前缀表达式、特殊矩阵和一二维数组的压缩储存等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习(11)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊-除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构的基本概念;算法的基本概念、特性以及时间复杂度、空间复杂度等举例说明;【含常见的报错问题及其对应的解决方法】
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!