我在使用指针算法执行选择排序时遇到问题,而不是使用常规索引表示法。我必须这样做的原因是课堂作业。重点是学习使用指针算法而不使用“作弊索引”(pointer + i
),其中i
将是索引:array[i]
。
在调用sort函数之前,我分配了一个包含1000个结构的数组。 typedef如下:
typedef struct
{
char* name;
char* art;
int rating;
} ENTRY;
我的想法是我读了一个包含ASCII艺术的文件。每件艺术品都被抛入自己的结构中。这是文本文件中的一个“条目”:
Jean Pajerek
|\_____/|
|[o] [o]|
| V |
| |
-ooo---ooo-
# 4
这是一只猫头鹰!但我需要做的是将名称,艺术和评级存储在结构的适当字段中。我的阅读功能完美无缺。我分配了1000个结构的数组,然后只需将文本文件读入其中。它只包含18个图像,所以不用担心。
现在让我们谈谈我的选择排序功能。我首先看一下使用索引表示法的整数数组的选择排序算法,然后我尝试根据我的要求调整它。
所以这是代码:
void sort(ENTRY* aryptr, int* counter)
{
ENTRY* slow;
ENTRY* fast;
ENTRY* lastmin;
ENTRY min;
ENTRY temp;
int i;
int j;
printf("\n\n...SORTING\n\n\n");
slow = aryptr;
for (i=0; i < *counter - 2; i++)
{
min = *slow;
fast = slow + 1;
for (j = i + 1; j < *counter-1; j++)
{
if (strcmp(fast->name, min.name) < 0 )
{
min = *fast;
lastmin = fast;
}
fast++;
}
temp = *slow;
*slow = min;
*lastmin = temp;
slow++;
}
}
我正在使用i
和j
作为计数器,因为我觉得测试像walker->name != NULL
这样的东西是不安全的。 (我是否应该尝试使用NULL测试?对我来说它似乎更“逻辑上令人满意”,如果我可以保证最后一个元素之后的事物,实际上是NULL ...)无论我用什么来跟踪我对缓慢和快速指针的位置,我有一个问题。
问题是这样的:我有这个art.txt文件,里面有很多不同的艺术品。有些艺术品是由同一个人。
VOLDEMORT
(art is hippogryph)
# 1
EDDARD STARK
(art is turtle)
# 4
EDDARD STARK
(art is owl)
# 3
TONY STARK
(art is blob)
#1
EDDARD STARK
(art is dragon)
#5
当我完成排序时,同一作者的艺术作品将在阵列中彼此相邻。我不关心同一个人的艺术秩序。假设我用我的代码对它进行排序:我得到这样的东西。
EDDARD STARK
(art is turtle)
# 4
EDDARD STARK
(art is owl)
# 3
EDDARD STARK
(art is dragon)
#5
EDDARD STARK
(art is turtle)
# 4
TONY STARK
(art is blob)
#1
VOLDEMORT
(art is hippogryph)
# 1
EDDARD STARK的分类艺术品将在END的那个区块中拥有第一件艺术品的副本。我看了我的逻辑,打印了各种东西进行调试,但我仍然无法弄清楚问题出在哪里。我想我将无法看到它,因为我已经看了我自己该死的代码这么久。有什么想法吗?
答案 0 :(得分:1)
void sort(ENTRY* aryptr, int* counter)
{
ENTRY* slow;
ENTRY* fast;
ENTRY* lastmin;
ENTRY min;
ENTRY temp;
int i;
int j;
printf("\n\n...SORTING\n\n\n");
slow = aryptr;
for (i=0; i < *counter - 2; i++)
{
min = *slow;
fast = slow + 1;
for (j = i + 1; j < *counter-1; j++)
{
if (strcmp(fast->name, min.name) < 0 )//comparison
{
min = *fast;//save data to min
lastmin = fast;//save position to last min
}
fast++;//increment index
}
//problematic, always swapping. need if statement. Lastmin
//May go unassigned, then "slow" will be duplicated to "lastmin"
temp = *slow;
*slow = min;
*lastmin = temp;//at first run through
slow++; //increment index
}
}