Изменить элемент из списка в конец - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть список на C, и я хочу его отсортировать.Все работает нормально, но когда я хочу изменить элемент с последним в списке.Элемент, который я хочу установить до конца, исчезает.У кого-нибудь из вас есть идея, в чем проблема?

struPerson* sortListWithSelectSort(struPerson* pStart) {

    struPerson* pLastElement = NULL;
    struPerson* pLastElementToCompare = NULL;

    for (struPerson* pElement = pStart; pElement->pNext != NULL; pElement = pElement->pNext) {

        pLastElementToCompare = pElement;
        struPerson* pElementToCompare = pElement->pNext;

        do {

            //boolean 0 = false, 1 true
            short isGreater = 0;

            //compare if change must be
            if (strcmp(pElement->nachname, pElementToCompare->nachname) > 0) {
                isGreater = 1;
            }
            else if (strcmp(pElement->nachname, pElementToCompare->nachname) == 0) {
                if (strcmp(pElement->vorname, pElementToCompare->vorname) > 0) {
                    isGreater = 1;
                }
            }

            //change elements
            struPerson* pTemp = pElement;

            if (isGreater > 0) {
                struPerson* pTempElementToCompareNext = pElementToCompare->pNext;

                //change position
                //check if the element is pStart
                if (pStart == pElement) {
                    pStart = pElementToCompare;
                }
                else {
                    pLastElement->pNext = pElementToCompare;
                }

                //check if they are behind
                if (pTemp->pNext = pElementToCompare) {
                    pTempElementToCompareNext = pElementToCompare->pNext;
                    pElementToCompare->pNext = pElement;
                    pElement->pNext = pTempElementToCompareNext;
                    pElement = pElementToCompare;
                    pElementToCompare = pTemp;
                    pLastElementToCompare = pElement;
                }
                else {
                    pTempElementToCompareNext = pElementToCompare->pNext;
                    pElementToCompare->pNext = pTemp->pNext;
                    pElement->pNext = pTempElementToCompareNext;
                    pElementToCompare->pNext->pNext = pElement;
                    pElement = pElementToCompare;
                    pElementToCompare = pTemp;
                }
            }
            else {
                //set Pointer for next comparison
                pLastElement = pElement;
                pLastElementToCompare = pLastElementToCompare;
            }

            if (pElementToCompare->pNext == NULL) {
            }
            else {
                pElementToCompare = pElementToCompare->pNext;
            }

        } while (pElementToCompare->pNext != NULL);
    }
    return pStart;
}

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Рабочее предложение, извините, мне лень искать больше, что не так в вашей версии

#if 0
void exchange(struPerson* p1, struPerson* p2)
{
  char * s;

  s = p1->nachname;
  p1->nachname = p2->nachname;
  p2->nachname = s;

  s = p1->vorname;
  p1->vorname = p2->vorname;
  p2->vorname = s;

  /* exchange other fields except pNext of course
     this is the disadvantage of that solution */
}
#else
/* other way but you have to check this works with your definition of struPerson */
void exchange(struPerson* p1, struPerson* p2)
{
  struPerson p = *p1;
  struPerson * p1next = p1->pNext;
  struPerson * p2next = p2->pNext;

  *p1 = *p2;
  *p2 = p;
  p1->pNext = p1next;
  p2->pNext = p2next;
}
#endif

void sortListWithBubbleSort(struPerson* pStart) {
    int modified;

    do {
        modified = 0;

        struPerson* pElement;

        for (pElement = pStart; pElement->pNext != NULL; pElement = pElement->pNext) {
          int cmp = strcmp(pElement->nachname, pElement->pNext->nachname);

          if ((cmp > 0) ||
              ((cmp == 0) && (strcmp(pElement->vorname, pElement->pNext->vorname) > 0))) {
            exchange(pElement, pElement->pNext);
            modified = 1;
          }
        }
    } while (modified != 0);
}

Как обычно с пузырьковой сортировкой, это не правильный способ всегда проверять последний элементПоскольку последние элементы уже отсортированы после хотя бы одного хода, я позволю вам улучшить это в качестве упражнения: -)

0 голосов
/ 22 декабря 2018

чуть меньше //check if they are behind: if (pTemp->pNext = pElementToCompare) { должно быть if (pTemp->pNext == pElementToCompare) {

Я рекомендую вам скомпилировать, требуя все предупреждения, например gcc -Wall ..., которые помогают увидеть такого рода ошибки и более

в блоке, прокомментированном //set Pointer for next comparison присваивание pLastElementToCompare = pLastElementToCompare; ничего не делает, должен быть другой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...