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;
}
先就这些吧,以后有了再补。
|