IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 课外闲谈2.常用操作总结 -> 正文阅读

[数据结构与算法]课外闲谈2.常用操作总结

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;
}

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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 16:14:34  更:2021-12-18 16:16:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:46:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码