目标:我正在使用指针,我遇到了很多问题。上周的任务是写一个插入排序函数,以降序排列一个不规则的数组。本周我的教授要我改变所有索引,只使用指针。
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;
}
我觉得*走路 - ;是我的问题的原因。当我使用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;
}
答案 0 :(得分:0)
Postfix运算符 - 具有比一元运算符*更高的优先级。你需要照顾它。你有没有忽视它?请查看以下链接中的优先顺序表
Shortcut to remember the Order of Evaluation and Precedence of Operators in C
答案 1 :(得分:0)
感谢您发布其余代码
我看一下,首先我建议您激活编译器可以显示的所有警告-Wall
等。
现在,实际的想法:
在你的中间嵌套for循环中,检查target = **ptr; target > 0
。这意味着只要数组中没有0,您的代码才会起作用!而不是尝试0终止,而是可以将条目数作为参数传递(除了指向数组的指针)。
关于三重嵌套的for-loop等: 代码建议你只想独立排序行(即不是按照另一行中给出的顺序排成一行),所以你应该做的第一件事是创建一个对单个数组进行排序的函数,如果你那么你可以在各个阵列上调用它。
编辑:对你的评论,确定你删除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...
,这意味着你的函数只适用于那些: