1

当我尝试编译它时,我遇到了这个错误,我真的不知道该怎么办。也许你可以帮我解决这个问题。

主要.cpp:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <list>
using namespace std;

list<int> liste;
int size=0;

void list_initialization(){
    cout << "Quicksort" << endl << endl;
    cout <<"List Initialization" << endl;
    while ((size<1)||size>100){
        cout << "Please enter the size (between 1 and 100)" << endl;
        cin >> size;
    }
    srand ( time(NULL) );
    for (int i=0; i<size; i++){
        liste.push_back(rand() %100 +1);
    }
}

void list_display(){
    cout << endl;
    for (list<int>::const_iterator ite=liste.begin(), end=liste.end(); ite!=end; ++ite)
            cout << *ite << " ";
    cout << endl;
}

int choose_pivot( int const& left, int const& right){
    int pivot;
    pivot = rand()%(right-left) + left ;
    return pivot;
}

int partition(int left, int right, int pivotIndex){


    //We Save pivotValue
    list<int>::iterator itPivotIndex = liste.begin();
    advance (itPivotIndex, pivotIndex);
    int pivotValue = *itPivotIndex;

    //Those 2 iterators will be used to swap 2 elements
    list<int>::iterator itSwap1 = liste.begin();
    list<int>::iterator itSwap2 = liste.begin();

    //2 iterators to point left and right elements
    list<int>::iterator itLeft = liste.begin();
    advance (itLeft, left);
    list<int>::iterator itRight = liste.begin();
    advance (itRight, right);

    //1 iterator to point the StoreIndex
    list<int>::iterator itStoreIndex=itLeft;


    //Move Pivot to End
    advance(itSwap1, pivotIndex);
    advance(itSwap2, right);
    swap(*itSwap1, *itSwap2);


    //Move all elements less than pivotValue before the pivot

    for(list<int>::iterator it=itLeft; it!=itRight; it++)
        if (*it < pivotValue){

            //Swap array[k] and array[storeIndex]
            itSwap1=it;
            itSwap2=itStoreIndex;
            swap(*itSwap1, *itSwap2);

            itStoreIndex++;
        }

    //Move pivot to its final place
    swap(*itStoreIndex, *itRight);

    return (distance(liste.begin(), itStoreIndex));
}


void quicksort (int left, int right){

    int pivotNewIndex=0;
    list<int>::iterator ite=liste.begin();

    if (left < right){

        int pivotIndex = choose_pivot(left,right);
        advance (ite,pivotIndex);
        cout << "The pivot is " << *ite <<endl;

        pivotNewIndex = partition(left, right, pivotIndex);

        list_display();
        cout << endl;

        // Recursively sort elements smaller than the pivot
    quicksort(left, pivotNewIndex - 1);

        // Recursively sort elements at least as big as the pivot
    quicksort(pivotNewIndex + 1, right);
    }

}

int main()
{
    list_initialization();
    list_display();
    cout << endl;

    int left=0;
    int right=size-1;

    quicksort(left, right);
    cout << "Sorted List :";
    list_display();

    cout << endl;
    return 0;

}

快速排序.cpp:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <list>
using namespace std;

 extern int array [];

int selectPivot( int const& left, int const& right);
int Partition(int left, int right, int pivotIndex);
void sorting (int left, int right);

int selectPivot( int const& left, int const& right){
    int pivot;
    pivot = rand()%(right-left) + left ;
    return pivot;
}

int Partition(int left, int right, int pivotIndex){

    int temp=0;
    int storeIndex=left;
    int pivotValue = array[pivotIndex];


    temp=pivotValue;
    pivotValue=array[right];
    array[right]=temp;


    for (int k=left; k<right; k++)
        if (array[k] < pivotValue){

            temp=array[k];
            array[k]=array[storeIndex];
            array[storeIndex]=temp;

            storeIndex++;
        }

    temp = array[storeIndex];
    array[storeIndex]=array[right];
    array[right]=temp;

    return storeIndex;
}


void sorting (int left, int right){

    int pivotNewIndex=0;

    if (left < right){

        int pivotIndex = selectPivot(left,right);

        pivotNewIndex = Partition(left, right, pivotIndex);


        sorting(left, pivotNewIndex - 1);


        sorting(pivotNewIndex + 1, right);
    }

}

-------------- 1>------构建开始:项目:实用2,配置:调试Win32 ------ 1>正在编译... 1>quicksort.cpp 1>链接... 1>quicksort.obj : 错误 LNK2001: 无法解析的外部符号“int * array” (?array@@3PAHA) 1>C:\Users\Amed\Documents\Visual Studio 2008\Projects\practical2\Debug \practical2.exe : 致命错误 LNK1120: 1 unresolved externals 1>构建日志保存在“file://c:\Users\Amed\Documents\Visual Studio 2008\Projects\practical2\practical2\Debug\BuildLog.htm”1 >practical2 - 2 个错误,0 个警告 ========== 构建:0 个成功,1 个失败,0 个最新,0 个跳过 ========= =

4

2 回答 2

4

您在 中写extern int array[]quicksort.cpp,但实际上并没有在任何地方定义它。有一个未解析的符号,因为它在任何地方都不存在,所以链接器找不到它来解析它。

于 2012-12-21T18:41:57.510 回答
0

您可以通过将其更改为来修复未解析的外部: int array[1024];

注:1024 是任意选择的数组维度。选择静态定义的 C 样式数组的维度有时很棘手。您可以通过切换到像标准库的 std::vector 类这样的动态结构来避免这个问题: std::vector nameOtherThanArray; // ;)

Naming the (global) variable "array" is probably too genetic to impart expected use in addition to possibly clashing with names in other libs. I did not attempt to code review the rest but if I were writing a real general purpose method, I'd want to pass in the structure being manipulated, or if it's just a temporary helper, declare it locally. Of course, like I said I didn't closely examine the rest of the code so your way may make sense for other reason.

于 2015-10-30T02:50:06.693 回答