Я работаю над проблемой, когда целью является создание связанного списка (очереди) в порядке возрастания, независимо от того, в каком порядке он введен. Я смог построить свое назначение так, чтобы оно вводило данные и толкало их в стек, и правильно выводит первый элемент из очереди (это код ниже), но я не могу заставить рабочий алгоритм построить очередь в по возрастанию.C: Создание очереди по возрастанию
Я переработал свой алгоритм, используя вторую функцию в своем addItem, чтобы найти правильное расположение любой новой структуры, поэтому теперь она корректно обрабатывает сортировку. Мой переработанный код ниже.
void addItemToQueue(int *identification, float *houlyrate) {
struct Employee *locateInsertionPoint(int *);
struct Employee *newAddress, *here;
newAddress = (struct Employee *) malloc(sizeof(struct Employee)); // Allocate Space for the new structure
if (newAddress == (struct Employee *) NULL) { // Display Error message and terminate if allocation fails
printf("\nERROR: Failed to allocate memory for this structure.\n");
free(queueOut); // Free the Queue in the event memory fails to allocate new space
exit(1);
}
if (queueOut == NULL) { // Does queue exist
newAddress->nextAddress = NULL;
queueOut = newAddress;
}
else if (*identification < queueOut->idnum) { // Is the new ID Number less than the old ID Number
newAddress->nextAddress = queueOut;
queueOut = newAddress;
}
else {
here = locateInsertionPoint(identification); // Use locateInsertionPoint() function to find proper place for new ID
newAddress->nextAddress = here->nextAddress;
here->nextAddress = newAddress;
}
newAddress->idnum = *identification; // Make new structure id num equal to the passed id num
newAddress->hourlyrate = *houlyrate; // Make new structure payrate equal to the passed payrate
}
struct Employee *locateInsertionPoint (int *idnum) {
struct Employee *one, *two;
one = queueOut;
two = one->nextAddress;
if (two == NULL) { // Check if There is only 1 item
return one;
}
while (1) { // LOOP
if (*idnum < two->idnum) { // Is the new ID less than current ID
break;
}
else if (two->nextAddress == NULL) { // IF Not, is the next address NULL
one = two;
break;
}
else { // IF Not, shift pointers to read next set
one = two;
two = one->nextAddress;
}
}
return one;
}
Если вы можете сократить размер этого вопроса до более минимального, вы можете получить больше ответа. 'addItemToQueue()' - это то, о чем вы заботитесь, поэтому попробуйте разрезать его на вашу попытку этой функции и почему она отличается от того, что вы ожидаете с помощью небольшого примера. См. [SSCCE] (http://sscce.org/) –
Существует три случая: 1) это первый элемент, который должен быть помещен в очередь, 2) в очереди уже есть элементы, но этот элемент должен прежде всего, перед любым из них, 3) указатель итерации достиг последнего элемента, который должен появиться перед этим новым, поэтому этот новый должен идти дальше. Ваш код решает один из них; решить другую, и мы дадим вам оставшуюся. – Beta
Бета, спасибо за ваш комментарий. После переосмысления моего кода я не знаю, как я думал, что это сработает в первую очередь. Я создал функциональное решение, которое теперь создает мой список в порядке возрастания и размещает его выше для всех, кто может захотеть его в качестве ссылки в будущем. – Monkey618