c语言中for循环改变一个变量的值,出循环之后该值变为了不是想要的值


//2.编写一个算法实现找出n个整数类型数据的顺序表中的最大数和最小数,然后将最大数放到最小数后面。如:原顺序表为:12,6,4,20,14,7,9,36,10,15,调整后顺序表为:12,6,4,36,20,14,7,9, 10,15。
#include<stdio.h>
#include <stdlib.h>
#define Size 10
typedef struct number{
    int * head;//声明了一个名为head的长度不确定的数组,也叫“动态数组”
    int length;//记录当前顺序表的长度
    int size;//记录顺序表分配的存储容量
}num;

num initNumber(){ //初始化
    num t;
    t.head=(int*)malloc(Size*sizeof(int));
    if (!t.head)
    {
        printf("初始化失败");
        exit(0);
    }
    t.length=0;
    t.size=Size;
    return t;
}

num fun(num num1){
    int i,j=0;
    int k=0;
    int min=num1.head[0];
    int max=num1.head[0];
    num num2=initNumber();
    for(i=0;i<Size;i++){        //将num1中的值赋值给num2
        num2.head[i]=num1.head[i];
    }
    i=0;
    while(i<num1.length){
        if(min>=num1.head[i]){ //寻找最小值和位置
            min=num1.head[i];
            k=i;
            printf("%d,%d ",i,k);
            i++;
        }
        else
            i++;
    }
    printf("%d,%d",min,k);//????
    for(i=0;i<num1.length;i++){  //寻找最大值和位置
        if(max<=num1.head[i]){
            max=num1.head[i];
            j=i;
        }
    }
    
    if(j>k){ //最大值在最小值前
        for(i=j;i<Size;i++){
            if(i==k){
                num1.head[i]=max;
            }
            else
                num1.head[i]=num1.head[i+1];
        }
    }
    else{  //最小值在最大值前面
        num1.head[k+1]=max;
        for(i=k+2;i<Size;i++){
            if(i==j)
                num1.head[i]=num2.head[i+1];
            else{
                num1.head[i]=num2.head[i-1];
            }
        }
    }
    return num1;

}
void display(num t){
    int i;
    for (i=0;i<t.length;i++) {
        printf("%d ",t.head[i]);
    }
    printf("\n");
}
int main(){
    int i;
    num t=initNumber();
    for(i=1;i<=Size;i++) {
        scanf("%d",&t.head[i-1]);
        t.length++;
    }
    t=fun(t);
    display(t);
    return 0;
}

结果:

img

k变成了212

img

修改了51-62行


#define _CRT_SECURE_NO_WARNINGS
//2.编写一个算法实现找出n个整数类型数据的顺序表中的最大数和最小数,然后将最大数放到最小数后面。如:原顺序表为:12,6,4,20,14,7,9,36,10,15,调整后顺序表为:12,6,4,36,20,14,7,9, 10,15。
#include<stdio.h>
#include <stdlib.h>
#define Size 10
typedef struct number {
    int* head;//声明了一个名为head的长度不确定的数组,也叫“动态数组”
    int length;//记录当前顺序表的长度
    int size;//记录顺序表分配的存储容量
}num;
num initNumber() { //初始化
    num t;
    t.head = (int*)malloc(Size * sizeof(int));
    if (!t.head)
    {
        printf("初始化失败");
        exit(0);
    }
    t.length = 0;
    t.size = Size;
    return t;
}
num fun(num num1) {
    int i, j = 0;
    int k = 0;
    int min = num1.head[0];
    int max = num1.head[0];
    num num2 = initNumber();
    for (i = 0; i < Size; i++) {        //将num1中的值赋值给num2
        num2.head[i] = num1.head[i];
    }
    i = 0;
    while (i < num1.length) {
        if (min >= num1.head[i]) { //寻找最小值和位置
            min = num1.head[i];
            k = i;
            i++;
        }
        else
            i++;
    }
    
    for (i = 0; i < num1.length; i++) {  //寻找最大值和位置
        if (max <= num1.head[i]) {
            max = num1.head[i];
            j = i;
        }
    }

      for (i = j; i < Size-1; i++) {
                num1.head[i] = num1.head[i + 1];
        }
      for (i = Size-1; i > k+1; i--) {
          num1.head[i] = num1.head[i - 1];
      }
      if (j > k) {
          num1.head[k + 1] = max;
      }
      else{
          num1.head[k] = max;
      }
      

    return num1;
}
void display(num t) {
    int i;
    for (i = 0; i < t.length; i++) {
        printf("%d ", t.head[i]);
    }
    printf("\n");
}
int main() {
    int i;
    num t = initNumber();
    for (i = 1; i <= Size; i++) {
        scanf("%d", &t.head[i - 1]);
        t.length++;
    }
    t = fun(t);
    display(t);
    return 0;
}