1

目标:我正在使用指针,但遇到了很多问题。上周的任务是编写一个插入排序函数来对一个参差不齐的数组进行降序排序。本周我的教授希望我更改所有索引并仅使用指针。

void insert(int **table, int row)
{

    //  Local Declaration
    int **ptr = table;
    int **walkPlus, *walk, temp;

    //  Statement
    for(ptr = (table + 1); *ptr != NULL; ptr++)
    {
        temp = **ptr;
        walk = *(ptr - 1);
        while(*walk >= diff && temp > *walk)
        {
            walkPlus = ptr;
            **walkPlus = *walk;
            *walk--;
        }
        **walkPlus = temp;
        printf("\n");
    }
    return;

}

我觉得 *walk--; 是我的问题的原因。当我使用 printf 语句检查它的值时,但我得到了一个奇怪的地址。我知道指针非常重要,我想确保我理解这个概念,所以任何帮助都将不胜感激。谢谢你。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#ifdef _MSC_VER
#include <crtdbg.h>  // needed to check for memory leaks (Windows only!)
#endif

#define MEM_ERROR printf("Not enough memory\n")

int** getRow(int *row);
void valiRow(int *row);
void getSize(int **table, int row);
void  valiSize(int *size);
void fillTable(int **table, int row);
void bubble(int **table, int row);
void insert(int **table, int row);
void freeAlo(int **table);

int main (void)
{
//  Local Declaration
int **table;
int row, i;
char answer;
int **pTable;
FILE* fpOutPut;

//  Statement

fpOutPut = fopen("Output.txt", "w");
if(fpOutPut == NULL)
{
    printf("Error, writing failed.\n");
    exit(103);
}

do
{
    table = getRow(&row);
    getSize(table, row);
    fillTable(table, row);
    bubble(table, row);
    insert(table, row);
    freeAlo(table);

    printf("\nDo you want to create a new ragged table? ");
    printf("[y] to continue: ");
    scanf(" %c", &answer);
    printf("\n");

}
while(toupper(answer) == 'Y');
fclose(fpOutPut);

#ifdef _MSC_VER
printf( _CrtDumpMemoryLeaks() ? "Memory Leak\n" : "No Memory Leak\n");
#endif
return 0;

}// main

/* getRow */
int** getRow(int *row)
{
//  Local Declaration
int **table;

//  Statement
printf("Please enter the number of rows (1-10): ");
scanf("%d", &*row);

valiRow(&*row);

table =(int**)calloc(*row + 1, sizeof(int));
if(table == NULL)
    MEM_ERROR, exit(100);

return table;
}

/* valiRow */
void valiRow(int *row)
{
//  Statement
while(*row > 10 || *row < 1)
{
    while(getchar() != '\n')
    ;
    printf("Please enter a number between (1-10): ");
    scanf("%d", &*row);
}

return;
}
/* getSize */
void getSize(int **table, int row)
{
//  Local Declaration
int size;
int **ptr = table;
int **pLast = table + row;

//  Statement
ptr = table;
for( ; ptr < pLast; ptr++)
{
    printf("Please enter a size (1-15): ");
    scanf("%d", &size);

    valiSize(&size);

    *ptr = (int*)calloc(size + 1, sizeof(int));
    **ptr = size;
}

if(table == NULL)
    MEM_ERROR, exit(101);

return;
}

/* valiSize */
void valiSize(int *size)
{
//  Statement
while(*size > 15 || *size < 1)
{
    while(getchar() != '\n')
    ;
    printf("Please enter a valid size (1-15): ");
    scanf("%d", &*size);
}

return;
}

/* fillTable */
void fillTable(int **table, int row)
{
//  Local Declaration
int random;
int **ptr = table;
int *pCurr, *pWalk;

//  Statement
srand(time(NULL));
for(pCurr = *ptr ; *ptr != NULL; ptr++)
{
    for(pWalk = (pCurr + 1); *pWalk < *pCurr; pWalk++)
    {
        random = -99 + rand() % 199;
        *pWalk = random;
    }
    pCurr = *(ptr + 1);
}

return;
}

/* bubble */
void bubble(int **table, int row)
{
//  Local Declaration
int **ptr;
int *pWalk;
int temp, target;

//  Statment
for(ptr = table; *ptr != NULL; ptr++)
{
    for(target = **ptr; target > 0; target--)
    {
        for(pWalk = *ptr + target; pWalk != *ptr + 1; pWalk--)
        {
            if(*pWalk > *(pWalk - 1))
            {
                temp = *pWalk;
                *pWalk = *(pWalk - 1);
                *(pWalk - 1) = temp;
            }
        }
    }
}

return;
}

/* insert */
void insert(int **table, int row)
{
//  Local Declaration
int **ptr = table;
int temp, *walk, **walkPlus;

//  Statement
for(ptr = (table + 1); *ptr != NULL; ptr++)
{
    temp = **ptr;
    walk = *(ptr - 1);
    while(*walk >= 0 && temp > *walk)
    {
        walkPlus = ptr;
        **walkPlus = *walk;
        *walk--;
    }
    **walkPlus = temp;
}
return;
}

/* freeAlo */
void freeAlo(int **table)
{
//  Local Declaration
int ** ptr;

//  Statement
for(ptr = table; *ptr != NULL; ptr++)
{
    free(*ptr);
}
free(ptr);

return;
}
4

2 回答 2

0

感谢您发布其余代码

我看过了,首先我建议您激活编译器可以显示的所有警告-Wall等。

现在,实际的想法:

在中间嵌套的 for 循环中检查target = **ptr; target > 0. 这意味着您的代码只有在您的数组中没有 0 时才能工作!您可以将条目数作为参数传递(除了指向数组的指针之外),而不是尝试 0 终止。

关于三重嵌套的for循环等:代码建议您只想对行进行独立排序(即不是按照另一行给出的顺序排列一行),因此您应该做的第一件事是创建一个对单个数组进行排序的函数,如果你有,那么你可以在单个数组上调用它。

编辑:对于您的评论,好的,请确保您删除 main() 对bubble() 的调用,否则您无法真正分辨出哪个排序函数(bubble vs insert)做了什么。

现在启用警告(-Wall 等,取决于编译器),您会看到:

a.c: In function 'fillTable':
a.c:138:33: error: unused parameter 'row' [-Werror=unused-parameter]
a.c: In function 'insert':
a.c:175:4: error: value computed is not used [-Werror=unused-value]
a.c:160:30: error: unused parameter 'row' [-Werror=unused-parameter]

例如,第 175 行中的内容讲述了 Kranthi Kumar 在他的回答中提到的内容。明确一点:*walk--什么都不做,试试--*walk. 未使用的参数警告表明可能忘记了某些东西。此外,当您修复这些时,可能会出现其他需要修复的错误。

编辑 2:我提到的其他排序函数对于 insert() 也是正确的:您正在使用while(*walk >= 0...,这意味着您的函数仅适用于以下数组:

  • 不包含负值
  • 在索引(-1)处有一个负值, 这被打破了!

祝你好运!

于 2013-02-12T11:02:53.323 回答
0

后修复运算符 -- 比一元运算符 * 具有更高的优先级。你需要照顾好它。你忽略了吗?请查看以下链接中的优先级表

记住 C 中运算符的评估顺序和优先级的快捷方式

于 2013-02-12T10:33:04.637 回答