使用struct作为“数据库”的任意数量单词(字母顺序)的排序算法

时间:2019-05-23 13:58:16

标签: c c99

因此,我应该将排序算法作为CS作业来做。

它应该读取任意数量的单词,每个单词均以'\ n'结尾。读取“。”后,应按字母顺序打印单词。

例如: 输入: 苹果 狗 奥地利 苹果

输出: 苹果 苹果 奥地利 狗

我想将单词存储到一个结构中。我认为,为了处理任意数量的单词,我应该制作结构数组。

到目前为止,我已经尝试创建仅具有一个成员(字符串)的typedef结构,并且我计划从中创建结构数组,然后将每个单词存储到该结构中。

关于单词数量的“随机性”,我想在找出已经写了多少个单词然后将每个单词存储到struct数组的每个元素中之后,在main中设置struct类型。

我的问题是: 1.我不知道如何找出字数。我尝试过的唯一一件事就是制作一个函数,该函数可以计算'\ n'出现的次数,尽管效果不是很好。

关于数据结构,我想出了只有一个字符串成员的struct:

typedef struct{
char string[MAX];
}sort;

然后在主要功能中,我首先读取了一些单词(不是实际的赋值,而只是为了使代码起作用)

并且在获得“ len”之后,我声明了sort类型的变量:

int main(){
/*code, scanf("%d", &len) and stuff*/
sort sort_t[len];

for(i = 0; i < len; i++){
    scanf("%s", sort_t[i].string);
}

问题:这样的事情是“合法的”吗,我是否使用一种好的方法?

Q2:开始存储结构之前,如何知道存储的单词数量(对于结构数组)?

1 个答案:

答案 0 :(得分:0)

恕我直言,为每个字符串保留相同的最大存储量的想法有点浪费。最好坚持使用动态的NUL终止的字符串,就像通常在C代码中那样。这是C库最支持的。

对于管理未知数量的字符串,您可以选择。可能性1是使用Xavier提到的链表。可能是最优雅的解决方案,但调试起来可能很耗时,最终您必须将其转换为数组才能使用一种常见的排序算法。

可能性2是使用类似于C ++ std :: vector对象的东西。假设分配存储的任务委托给某个“袋子”对象。处理“袋子”的代码在调用Vlad提到的 realloc()函数上具有垄断地位。您的主要函数仅调用 bag_create() bag_put(bag,string)。这不太优雅,但可能更容易实现。

由于您将重点放在排序算法上,因此我建议使用方法2。您可以使用下面的代码片段作为起点。

#include  <stdlib.h>
#include  <string.h>
#include  <stdio.h>

typedef struct {
    size_t    capacity;
    size_t    usedSlotCount;
    char**    storage;
} StringBag;


StringBag* bag_create()
{
    size_t initialSize = 4;  /* start small */
    StringBag*   myBag = malloc(sizeof(StringBag));

    myBag->capacity      = initialSize;
    myBag->usedSlotCount = 0;
    myBag->storage       = (char**)malloc(initialSize*sizeof(char*));

    return myBag;
}

void bag_put(StringBag* myBag, char* str)
{
    if (myBag->capacity == myBag->usedSlotCount) {
        /* have to grow storage */
        size_t  oldCapacity = myBag->capacity;
        size_t  newCapacity = 2 * oldCapacity;
        myBag->storage = realloc(myBag->storage, newCapacity*sizeof(char*));
        if (NULL == myBag->storage) {
            fprintf(stderr, "Out of memory while reallocating\n");
            exit(1);
        }
        fprintf(stderr, "Growing capacity to %lu\n", (unsigned long)newCapacity);
        myBag->capacity = newCapacity;
    }

    /* save string to new allocated memory, as this */
    /* allows the caller to always use the same static storage to house str  */

    char* str2 = malloc(1+strlen(str));
    strcpy(str2, str);
    myBag->storage[myBag->usedSlotCount] = str2;
    myBag->usedSlotCount++;
}


static char inputLine[4096];


int main()
{
    StringBag*  myBag = bag_create();

    /* read input data  */
    while(scanf("%s", inputLine) != EOF) {
        if (0 == strcmp(".", inputLine))
            break;
        bag_put(myBag, inputLine);
    }

    /* TODO: sort myBag->storage and print the sorted array */

}