顺序表,cg运行结果和自己编译器结果不同

img

img

img

编译器上运行结果正确,但CG上却不通过


#include 
using namespace std;
#define InitSize 100
typedef struct {
    int length;
    int Maxsize;
    int* data;
}SqList;
void InitList(SqList& L)//初始化顺序表
{
    L.data = (int*)malloc(sizeof(int) * InitSize);
    L.length = 0;
    L.Maxsize = InitSize;
}
void Insertpush(SqList& L, int n)//输入数据
{
    int i;
    L.length = n;
    for (i = 0; i < n; i++)
    {
        cin >> L.data[i];
    }
}
int CompareData(SqList L, int e, int n)//比较大小,返回位序
{
    int i;
    for (i = 0; i < n; i++)
    {
        if (L.data[i - 1] < e && L.data[i] > e)
            return (i + 1);
    }
    return 0;
}
void InsertList(SqList& L, int i, int e)//相应位置插入e
{
    int j;
    for (j = L.length; j >= i; j--)
    {
        L.data[j] = L.data[j - 1];
    }
    L.data[i - 1] = e;
    L.length++;
}
void PrintList(SqList &L)//输出顺序表
{
    int i;
    for (i = 0; i < L.length; i++)
    {
        cout << L.data[i];
        if (i + 1 < L.length)
            cout << ',';
    }
}
int main()
{
    SqList L;
    InitList(L);
    int n, e;
    cin >> n;
    Insertpush(L, n);
    cin >> e;
    int ret=CompareData(L, e, n);
    InsertList(L, ret, e);
    PrintList(L);
    system("pause");
    return 0;
}

 for (i = 0; i < n; i++)
    {
        if (L.data[i - 1] < e && L.data[i] > e)
            return (i + 1);
    }
L.data[i-1]当i为0时崩溃了啊
  1. CompareData函数中,原来的判断条件是if (L.data[i - 1] < e && L.data[i] > e),但是这样会导致在e比所有元素都大的情况下,返回值为0,而实际上应该返回n+1,表示插入到最后。因此修改为if (L.data[i] > e)

  2. 在CG上,不需要使用system("pause"),因此去掉这一行即可。
    以下是修改后的代码:

#include <iostream>
using namespace std;
#define InitSize 100
typedef struct {
    int length;
    int Maxsize;
    int* data;
}SqList;
void InitList(SqList& L)//初始化顺序表
{
    L.data = (int*)malloc(sizeof(int) * InitSize);
    L.length = 0;
    L.Maxsize = InitSize;
}
void Insertpush(SqList& L, int n)//输入数据
{
    int i;
    L.length = n;
    for (i = 0; i < n; i++)
    {
        cin >> L.data[i];
    }
}
int CompareData(SqList L, int e, int n)//比较大小,返回位序
{
    int i;
    for (i = 0; i < n; i++)
    {
        if (L.data[i] > e)
            return (i + 1);
    }
    return n + 1;
}
void InsertList(SqList& L, int i, int e)//相应位置插入e
{
    int j;
    for (j = L.length; j >= i; j--)
    {
        L.data[j] = L.data[j - 1];
    }
    L.data[i - 1] = e;
    L.length++;
}
void PrintList(SqList &L)//输出顺序表
{
    int i;
    for (i = 0; i < L.length; i++)
    {
        cout << L.data[i];
        if (i + 1 < L.length)
            cout << ',';
    }
}
int main()
{
    SqList L;
    InitList(L);
    int n, e;
    cin >> n;
    Insertpush(L, n);
    cin >> e;
    int ret=CompareData(L, e, n);
    InsertList(L, ret, e);
    PrintList(L);
    return 0;
}

有两个问题:
(1)CompareData()函数中,for循环 i 从0开始,i-1会导致越界。
(2)题目的样例输入中,n个数据之间是用逗号分隔,Insertpush()函数中读取数据时需要用cin.get()吸收中间的逗号。

Insertpush()和CompareData()函数修改如下:

void Insertpush(SqList& L, int n)//输入数据
{
    int i;
    char ch;
    L.length = n;
    for (i = 0; i < n; i++)
    {
        cin >> L.data[i];
        ch = cin.get(); //吸收逗号
    }
}

int CompareData(SqList L, int e, int n)//比较大小,返回位序
{
    int i;
    for (i = 0; i < n; i++)
    {
        if ( L.data[i] > e) //修改
            return (i + 1);
    }
    return (n+1);
}

int CompareData(SqList L, int e, int n)//比较大小,返回位序
{
    int i;
    for (i = 0; i < n; i++)
    {
        if (L.data[i] < e && L.data[i + 1] > e)
            return (i + 2);
    }
    return 0;
}

修改后再CG上运行依旧错误

  • 这篇博客: CG共轭梯度下降法【学习笔记、例题与代码】中的 共轭和预备知识 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 共轭:A共轭的定义
    在这里插入图片描述
    引申:非零向量如果共轭,则一定线性无关。
    在这里插入图片描述
    此图:只要a_i彼此正交,则xi很容易计算。

    问题再次转化:要求x,可以用aplha表示,而alpha只和p有关
    因此,只要给出一组A共轭的向量组,就可以把x写出来。