数组的基本操作

一:实现数组的增删改查

        题目:描述

        给定数组的大小为10,按升序输入n个数,进行以下操作

        输入这10个数;

        插入一个数;

        删除一个数;

        修改指定的数据;

        查找指定数据是否存在;

        无论做何种操作,都要保证是升序。

#include<stdio.h>
//插入一个数
int insertnum(int num,int n,int a[]){
	int t,j,i;
	for(i=0;i<n;i++){
		if(a[i]>num){
			t=i-1;
			break;
		}	
	}
	for(j=n;j>t+1;j--){
		a[j]=a[j-1];
	}
	a[t+1]=num;
	for(i=0;i<n+1;i++)
		printf("%d ",a[i]);
	return 0;
}
//删除数组中的一个数
int deletenum(int num,int n,int a[]){
	int i,j,t;
	for(i=0;i<n;i++){
		if(a[i]==num){
			t=i;
			break;
		}
	}
	for(i=t;i<n-1;i++){
		a[i]=a[i+1];
	}
	for(i=0;i<n;i++)
		printf("%d",a[i]);
	return 0;	
}
//修改指定的数
int amendnum(int index,int n,int a[]){
	int i,t;
	printf("请输入您要修改%d位置的数为:\n",index);
	scanf("%d",&t);
	a[index]=t;
	for(i=0;i<n;i++){
		printf("%d",a[i]);
	}
	return 0;
}
//查找指定的数
int seeknum(int num,int n,int a[]){
	int i,t=0,j;
	for(i=0;i<n;i++){
		if(a[i]==num){
			t=1;
			j=i+1; 
			break;
		}	
	}
	if(t==1) printf("数据%d在数组第%d个位置上\n",num,j);
	if(t==0) printf("该数据不存在\n");
	return 0;
}
int main(){
//定义一个大小为10的数组,n为输入的数的个数 
	printf("按1为插入一个数,按2为删除一个数,按3为修改指定数据,按4为查找指定数\n");
	int a[10]={0},n,i;
	printf("请输入您要输入多少个数:\n");
	scanf("%d",&n);
//按升序输入 
	printf("请输入数组的%d个数,需要升序输入哦:\n",n); 
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	printf("请输入您需要的操作的数\n");
	int order;
	scanf("%d",&order);
//插入操作 --
	if(order==1){
//num1为插入的数
	printf("请输入您要插入的数:\n"); 
	int num1;
	scanf("%d",&num1);
	insertnum(num1,n,a);
	}
//删除操作--
	else if(order==2){
//num2为删除的数
	printf("请输入您要删除的数:\n");
	int num2;
	scanf("%d",&num2);
	deletenum(num2,n,a);
	}
//修改指定的数 
	else if(order==3){
//index为需要修改的数的下标
	printf("请输入您要修改的数的下标:\n"); 
	int index;
	scanf("%d",&index);
	amendnum(index,n,a);
	}
	else if(order==4){
//查找指定数据是否存在
	int num3;
	printf("请输入您要查找的数:");
	scanf("%d",&num3); 
	seeknum(num3,n,a);
	}
	return 0;
}

二:数组的左移

输入一个整数n,数组的长度为n,长为n的一维数组循环左移m位。

#include <stdio.h>
int main()
{
    int n;
    int i;
    printf("请输入一个正整数n:\n"); 
    scanf("%d",&n);
    int a[100];
    printf("给数组输入%d个数\n",n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    int m;
    printf("请输入需要左移多少?\n");
    scanf("%d",&m); 
    //进行循环左移 
    m = m%n;//取模 
    if(m==0){
        for(i=0;i<n;i++)
		{
            if(i==0)
			{
                printf("%d",a[i]);
            }
			else
			{
                printf(" %d",a[i]);
            }
        }
    }
	else
	{
        for(i=m;i<n;i++)
		{
            if(i==m)
			{
                printf("%d",a[i]);
            }
			else
			{
                printf(" %d",a[i]);
            }
        }
        for(i=0;i<m;i++)
		{
            printf(" %d",a[i]);
        }
    }
    return 0;
}

三:循环链表实现约瑟夫环

        

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int num;
	struct node *next;
}person;
person* initlink(int n){
	person* head=(person*)malloc(sizeof(person));
	head->num=1;
	head->next=NULL;
	person*cyclic=head;
	int i;
	for(i=2;i<=n;i++){
		person* body=(person*)malloc(sizeof(person));
		body->num=i;
		body->next=NULL;
		cyclic->next=body;
		cyclic=cyclic->next; 
	}
	cyclic->next=head;
	return head;
} 
void findandko(person*head,int k,int m){
	//用来辅助遍历 
	person* tail=head;
	//用来指向出列的人 
	person*p=head;
	//找到编号为k的人
	while(p->num!=k){
		tail=p;
		p=p->next;
	}
	//从编号为K的人开始,只有符合p->next==p时,说明链表中除了p结点,所有编号都出列了
	while(p->next!=p){
		//找到从p报数1开始,报m的人,并且还要知道m-1的人的位置tail,
		int i;
		for(i=1;i<m;i++){
			tail=p;
			p=p->next;
		} 
		tail->next=p->next;
		printf("出列人的编号为:%d\n",p->num);
		free(p);
		p=tail->next;
	}
	printf("最后圆桌上留下的人的编号为:%d\n",p->num);
	free(p);	
}
int main(){
	printf("输入圆桌上的人数n:\n");
	int n;
	scanf("%d",&n);
	person*head=initlink(n);
	printf("从第k个人开始报数(k>1andk<%d)\n",n);
	int k;
	scanf("%d",&k);
	printf("数到m的人出列:\n");
	int m;
	scanf("%d",&m);
	findandko(head,k,m);
	return 0;
}

               

        

        

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值