2013-03-03 2 views
1

Рассмотрим:Как связать связанный список с статическим массивом на C++?

struct Package_Node 
    { 
     int bar_code; 
     float package_weight; 
     struct Package_Node *next_packaged; 
    }; 

    struct Key_Node 
    { 
     int key; 
     struct Package_Node *next_package; 
    }; 

    int weightTemp = 0, barcodeTemp = 0, keyTemp = 0, N = 0, X = 0, max_value = 0, optionChosen = 0, optionChosenTwo = 0; 
    float tempWeight; 

    int main() 
    { 
     srand(time(NULL)); 
     do 
     { 
      cout << "1 - Enter Number of keys and the Max Value\n2 - Enter Number of Packages (N)\n"; 
      cout << "3 - Create Array of Keys\n4 - Organize Packages\n5 - Table Stats\n6 - Clean Table\n7 - Exit\n\n"; 
      cin >> optionChosen; 

      switch(optionChosen) 
      { 
       case 1: 
       { 
        cout << "\nEnter Number of Keys:"; 
        cin >>X; 
        cout <<"\nEnter Max Value of the Barcode: "; 
        cin >>max_value; 
        break; 
       } 

       case 2: 
       { 
        cout << "\nEnter Number of Packages: "; 
        cin >> N; 
        //keyTemp= 
        break; 
       } 

       case 3: 
       { 
        Key_Node keyMain[X]; 
        for(int i=0;i<X;i++) 
        { 
         keyMain[i].key=i; 
         //cout << keyMain[i].key; //to see key values. 
        } 
        break; 
       } 

       case 4: 
       { 
        Package_Node totalPackages[N]; 
        for(int i=0;i<N;i++) 
        { 
         barcodeTemp = rand() % max_value + 1; 
         keyTemp = barcodeTemp % X; 
         tempWeight = rand() % 500 + 1; 
         totalPackages[i].bar_code=barcodeTemp; 
         totalPackages[i].package_weight=tempWeight; 

        } 
        for(int i=0;i<N;i++) 
        { 
         cout << totalPackages[i].bar_code <<endl; 
         cout << totalPackages[i].package_weight << endl; 
        } 

Это мой код. Я пытаюсь поместить информацию об общих пакетах [i] (динамический массив) и связать ее с keyMain (типа данных Package_Node и статического массива). Но я полностью потерял здесь, как это сделать.

Также является ли мое объявление динамического массива «totalPackages» правильным? Или я не должен объявлять его размер, так как это будет расти в соответствии с общим количеством пакетов, введенных пользователем? totalPackages предполагается связанный список, который растет по мере того, как программа хочет.

+1

Этот код не подходит для компиляции, а тем более работает корректно (или даже * неправильно). Недопустимые объявления переменных ('totalPackages'), неполные' main() '(и' case', 'switch' и' do-while'). Просьба предоставить [SSCCE] (http://sscce.org), который усиливает ваш вопрос. – WhozCraig

+0

@WhozCraig Я добавил декларацию totalPackages, которая, по-видимому, была удалена во время публикации. Другие части будут обработаны позже, я пытаюсь выяснить, как указать point key_node. Указатель next_package keyMain будет указывать на указатель totalPackages [some number]? – 2013-03-03 19:20:35

+0

Все еще не компилируется, а также, C++ не поддерживает объявления VLA (переменная длина массива). Ваша реализация может это позволить, но она нестандартна. Вы были бы значительно ближе к портативным, используя 'std :: vector '. Даже тогда, если вы предполагаете использовать связанный список, как указано в вопросе, я не вижу, как вы заключили, что статический массив будет приемлемым для любой проблемы. – WhozCraig

ответ

0

В C++ переменные, объявленные между фигурными фигурными скобками {}, являются локальными: они «перестают существовать» при запуске кода за пределами фигурных скобок.

Ваш код выглядит следующим образом:

 case 3: 
     { 
      Key_Node keyMain[X]; 
     } 
     case 4: 
     { 
      Package_Node totalPackages[N]; 
     } 

невозможно иметь одну часть материала, доступа к коду, объявленного в другой. Для того, чтобы исправить, объявить вещи в начале главной функции:

int main() 
{ 
    Key_Node keyMain[X]; 
    Package_Node totalPackages[N]; 
    ... 
} 

Теперь заявления плохо, потому что они идут, прежде чем пользователь поставляет значения X и N. Чтобы исправить это, заменить массивы на std::vector:

int main() 
{ 
    std::vector<Key_Node> keyMain; 
    std::vector<Package_Node> totalPackages; 
    ... 
} 

Вам нужно будет научиться работать с std::vectorsee the documentation, особенно push_back и size). Кроме того, посмотрите документацию std::list; это может помочь вам.

Смежные вопросы