一:实现数组的增删改查
题目:描述
给定数组的大小为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;
}