получить слияние для работы над связанным списком? - PullRequest
2 голосов
/ 08 ноября 2011

Извиняюсь, если это глупый / простой вопрос ... но я очень растерялся. У меня проблемы с запуском этой программы. Я написал эту программу для чтения в 2 значениях, первое из которых представляет собой количество элементов в связанном списке, а второе - максимальное случайное значение, которое можно поместить в каждый элемент.

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

Хорошо, я получаю сообщения об ошибках вроде:

base operand of `->' has non-pointer type `LIST'

и

request for member `element' in `conductor', which is of non-aggregate type `LIST *'

... (и несколько других).

Да, это для класса. Я написал программу, но я не уверен, что я здесь сделал неправильно или почему я получаю ошибки? Любая помощь приветствуется! Спасибо

#include <cstdlib>
#include <iostream>
#include <math.h>
#include <sys/time.h>

using namespace std;

typedef struct LIST {
    int element;
    LIST *next;
};

LIST split(LIST list)
{
    LIST pSecondCell;

    if (list == NULL)
        return NULL;
    else if (list.next == NULL)
        return NULL;
    else {
        pSecondCell = list.next;
        list.next = pSecondCell.next;
        pSecondCell.next = split(pSecondCell->next);
        return pSecondCell;
    }
}

LIST merge(LIST list1, LIST list2)
{
    if (list1 == NULL)
        return list2;
    else if (list2 == NULL)
        return list1;
    else if (list1.element <= list2.element) {
        list1.next = merge(list1.next, list2);
        return list1;
    } else {
        list2.next = merge(list1, list2.next);
    }
}

LIST MergeSort(LIST list)
{
    LIST SecondList;

    if (list == NULL)
        return NULL;
    else if (list.next == NULL)
        return list;
    else {
        SecondList = split(list);
        return merge(MergeSort(list), MergeSort(SecondList));
    }
}

int main(int argCount, char *argVal[])
{
    int i, number, max;
    struct timeval time1;
    struct timeval time2;

    //check for correct number of arguments
    if (argCount != 3) {
        cout << "Incorrect number of arguments" << endl;
        return 0;
    }
    // initialize read in n and max values
    number = atoi(argVal[1]);
    max = atoi(argVal[2]);

    // create list and fill with random numbers
    LIST *conductor;
    LIST *root = new LIST;
    conductor = root;

    for (i = 0; i < number; i++) {
        conductor.element = rand() % max;
        conductor.next = new LIST;
        conductor = conductor.next;
    }

    // time how long it takes to sort array using mergeSort
    gettimeofday(&time1, NULL);
    mergeSort(root);
    gettimeofday(&time2, NULL);

    // print name, sorted array, and running time
    cout << "Heather Wilson" << endl;

    conductor = root;

    for (i = 0; i < number - 2; i++) {
        cout << conductor.element << ", ";
        conductor = conductor.next;
    }

    double micro1 = time1.tv_sec * 1000000 + time1.tv_usec;
    double micro2 = time2.tv_sec * 1000000 + time2.tv_usec;

    cout << conductor.element << endl;
    cout << "Running time: " << micro2 - micro1 << " microseconds" << endl;

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

Для base operand of -> 'имеет тип без указателя LIST'
Замените -> на .. Вы хотите получить доступ к члену локальной LIST, а не члену указанного объекта.

request for member элемент 'в conductor', which is of non-aggregate type LIST *
Это наоборот. Замените . на ->. Вы хотите получить доступ к члену, указанному в LIST, а не к члену указателя.

Для пояснения, я не читал код. Слишком много Но это обычные способы устранения этих конкретных ошибок. парапура, кажется, действительно прочитала код.

1 голос
/ 08 ноября 2011

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

Вот сокращенное начало вашего кода с исправленными ошибками:

#include <iostream>

using namespace std;

typedef struct LIST{
  int element;
  LIST *next;
};

int main(){
  int i, number, max;

  number = 5;
  max = 100;

  // create list and fill with random numbers
  LIST *conductor;
  LIST *root = new LIST;
  conductor = root;

  for(i=0; i<number; i++){
    conductor->element = rand() % max;

    cout << "element " << i << " is " << conductor->element << endl;
    conductor->next = new LIST;
    conductor = conductor->next;
  }

  conductor = root; // Forgot this, didn't you!

  for(i=0; i<number-2;i++){
    cout << conductor->element << ", ";
    conductor = conductor->next;
  }

  return 0;
}

Взгляните на это, убедитесь, что оно работает, убедитесь, что вы понимаете изменения, которые я сделал, и тогда вы можете попробовать свои функции split, merge и MergeSort и ввод / вывод ( по одному, и тестирование на каждом этапе, естественно).

1 голос
/ 08 ноября 2011

Я думаю, что все места, которые вы проходите

 LIST merge ( LIST list1 , LIST list2 )

должно быть

 LIST* merge ( LIST* list1 , LIST* list2 )
...