Вставка Сортировка массива строк в C - PullRequest
0 голосов
/ 29 ноября 2018

Для одного из моих заданий мне нужно, чтобы пользователь вводил список имен, и пока они вводят их, они должны сортироваться по алфавиту по мере их поступления.Мне было интересно (1) при объявлении массива строк, который лучше всего использовать:

char test[10][10];

или

char *test[10]; 

и (2) лучший способ написать метод вставки,Я знаю, как написать метод сортировки вставками, и есть много примеров в Интернете, но они имеют дело в основном только с 1D массивами, поэтому я немного растерялся, как это сделать.Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я не хочу решать задачи здесь, поэтому я просто кратко подтолкну в правильном направлении:

То, что вы хотите, это связанный список;затем, когда пользователь вводит новое имя, вы можете вставить новую запись прямо в нее в правильном положении.

Первый запуск может выглядеть так:

struct entry { char name[10]; struct entry* next; };

struct entry* root = NULL;

void addname(char* na) {
    if (root == NULL) {
        root = (struct entry*)malloc(sizeof(struct entry));
        sprintf(entry->name, "%s", na);
    }else{
        // HERE, walk through all entries! Once you reach one, where next is lex. greater then you create a new entry, and link it into that position of the chain
    }
}
0 голосов
/ 29 ноября 2018

Декларации, которые вы показываете, очень отличаются.Первый - это массив массивов char, а второй - массив указателей на char (также известный как зубчатый массив ).

Оба могут рассматриваться одинаковоКак массивы строк, но есть довольно много семантических различий.Например, в первом ваши строки ограничены девятью символами (плюс терминатор), в то время как во втором строки могут быть любой длины (вписываясь в память).

Существует также разница в том, как эти два массива распадается (что происходит, когда вы используете простой test, когда ожидается указатель).Первый будет распадаться на указатель на массив char, то есть char (*)[10].Второй будет затухать, указывая на указатель на char, то есть char **.

Теперь по большому вопросу: что вы должны использовать?Ну, это действительно зависит от варианта использования.Будут ли у вас только строки фиксированного размера, размер которых известен с самого начала (а общий размер достаточно мал, чтобы поместиться в стек, где обычно хранятся локальные переменные)?Тогда вы можете использовать первый.Если вы не знаете длины строк или они могут отличаться более чем на несколько символов, тогда, вероятно, лучше выбрать второй.


Второй вопрос во многом зависит отвыбор массивов.Если у вас есть массивы массивов (первое объявление), вам нужно скопировать строки, используя strcpy.Если вы выбрали массив указателей (второе объявление), вы можете просто назначить указатели вокруг.

...