泫溯 2024-09-11 13:29 采纳率: 94.7%
浏览 8
已结题

数据结构构造三元组(相关搜索:用c语言)

img


数据结构构造三元组,这里用c语言为什么总是报这种错,求修改,在visiual studio一直运行不了


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int Status;
typedef int* Triplet;
void initTriplet(Triplet T, int v1, int v2, int v3)
{
    T = (Status*)malloc(3 * sizeof(Status)); //c语言动态分布内存
    T[0] = v1;
    T[1] = v2;
    T[2] = v3;
    if (!T) exit(-2);
}
void DestoryTriplet(Triplet T)
{
    free(T); //释放内存;

}
void Get(Triplet T, int i, int* e)
{
    Status num;
    int j = 0;
    while (j--)
    {
        num = &T[j++];
    }
    e = num;
}
void Put(Triplet T, int i, Status* e)
{
    int num;
    int j = i + 1;
    while (j--)
    {
        num = &T[j++];
    }
    T[j - 1] = e;
}

void IsAscending(Triplet T)
{
    if (T[0] <= T[1] && T[1] <= T[2])
        printf("1");
    else printf("0");

}
void IsDescending(Triplet T)
{
    if (T[0] > T[1] && T[1] >= T[2])
        printf("1");
    else printf("0");

}
Status Max(Triplet T, Status e)
{
    e = (T[0] >= T[1] ? ((T[0] >= T[2]) ? T[0] : T[2]) : ((T[1] >= T[2]) ? T[1] : T[2]));
    return e;
}
Status Min(Triplet T, Status e)
{
    e = (T[0] <= T[1] ? ((T[0] <= T[2]) ? T[0] : T[2]) : ((T[1] <= T[2]) ? T[1] : T[2]));
    return e;
}
int main()
{
    Triplet tt=NULL;
    Status e=0;
    initTriplet(tt, 3, 7, 8);
    Put(tt, 1, e);
    IsAscending(tt);
    IsDescending(tt);
    Get(tt, 2, e);
    printf("%d", e);
    
    printf("%d", Max(tt, e));
    printf("%d", Min(tt, e));
    return 0;

}


  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-11 17:53
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的代码中存在一些问题,我将尝试帮助你解决这些问题。首先,我会解释一下你的代码在做什么,然后指出其中的问题并给出修正方案。你的代码是关于构造和使用三元组(三元组通常指的是包含三个元素的数据结构)的。其中包括了初始化三元组、销毁三元组、获取三元组中的元素、设置三元组中的元素、判断三元组是否升序或降序以及获取三元组中的最大和最小元素等操作。主要的问题包括内存分配、指针使用以及逻辑判断错误等。

    问题一:内存分配和指针使用错误。在C语言中,动态分配内存后需要返回分配的内存地址给指针变量,但是在你的代码中,你在函数initTriplet中分配了内存,但是没有正确返回分配的内存地址给调用者。另外,在函数GetPut中,你试图改变数组元素的值但是没有正确地使用指针传递地址。因此,你需要修复这些问题。以下是修正后的代码片段:

    typedef struct {
        Status data[3]; // 在结构体内部定义数组来存储三个元素的数据
    } Triplet;
    
    void initTriplet(Triplet* T, int v1, int v2, int v3) {
        T->data[0] = v1;
        T->data[1] = v2;
        T->data[2] = v3;
    }
    
    void Get(Triplet T, int i, Status* e) {
        if (i >= 0 && i < 3) { // 检查索引是否有效
            *e = T.data[i]; // 使用指针来传递值
        } else {
            printf("Index out of bounds\n"); // 输出错误信息或抛出异常
        }
    }
    
    void Put(Triplet* T, int i, Status e) {
        if (i >= 0 && i < 3) { // 检查索引是否有效
            T->data[i] = e; // 直接设置数组元素的值
        } else {
            printf("Index out of bounds\n"); // 输出错误信息或抛出异常
        }
    }
    

    问题二:逻辑判断错误。在函数IsAscendingIsDescending中,你试图检查三元组是否升序或降序,但是在你的原始代码中逻辑判断的条件不正确。你需要使用逻辑AND操作符(&&)而不是位AND操作符(&)。以下是修正后的代码片段:

    void IsAscending(Triplet T) {
        if (T.data[0] <= T.data[1] && T.data[1] <= T.data[2]) { // 使用逻辑AND操作符来检查是否升序排列
            printf("Ascending\n"); // 输出升序的信息或者返回某个值(如返回true)
        } else { // 如果不满足升序条件,输出非升序的信息或者返回某个值(如返回false)
            printf("Not ascending\n"); // 输出非升序的信息或者返回某个值(如返回false)或者其他处理逻辑...
        }
    }
    void IsDescending(Triplet T) { // 同理修改降序的判断逻辑... } // 同理修改降序的判断逻辑... } ... 省略其他部分的代码 ... } ...省略其他部分的代码... } ...省略其他部分的代码... } 省略部分是你的剩余代码(如主函数main等)。以上是我对你的问题的回答。希望对你有所帮助!如果你还有其他问题或需要进一步的帮助,请随时向我提问。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月4日
  • 已采纳回答 9月26日
  • 创建了问题 9月11日