Ваш код - беспорядок. Существует ряд проблем, как семантических, так и логических, но в основном логика, решающая, куда вставлять новые узлы, является наиболее ошибочной. Измените это на это (обратите внимание на мой новый код в блоке else):
void recAdd(const char*t) {
char temp[bufferSize];
strcpy(temp, t);
p = new record;
temp[strlen(temp)] = '\0';
for (int j=0;j<bufferSize;j++) p->cont[j] = temp[j];
if (start==NULL) { start=p; start->next = 0; }
else {
record* x = start;
record* prev = 0;
while( x && recComp(x->cont, p->cont) <= 0 )
{
prev = x;
x = x->next;
}
// p is a new node. p, x and prev are arranged thusly:
// prev -> p -> x
// if prev is null, p is a new head
// if x is null, p is a new tail
// otherwise, p is inserted between prev and x
if( !prev )
{
p->next = start;
start = p;
}
else if( !x )
// note this block and the next one could be combined.
// done this way for clarity.
{
prev->next = p;
p->next = 0;
}
else
{
p->next = x;
prev->next = p;
}
}
for (int j=0;j<bufferSize;j++) temp[j] = NULL;
};
НО тот факт, что у вас было достаточно проблем с написанием этого кода, что вы обратились бы к SO за помощью в его исправлении, иллюстрирует важный момент: лучшим кодом является код, который вам никогда не придется писать. Вы написали как структуру типа связанного списка (хотя бы голыми), так и алгоритм сортировки. Оба имеют недостатки, и оба имеют рабочие, проверенные и эффективные версии, доступные как часть стандартных библиотек C ++. Вы должны использовать их. Используйте строки вместо char * s. Используйте векторы вместо вашего связанного списка. Используйте sort
вместо алгоритма ручной сортировки. Взятые вместе, весь ваш код можно заменить следующим:
vector<string> records;
// this for block just populates the vector with random strings
for( int i = 0; i < 10; ++i )
{
string s;
for( int j = 0, jx = 3+(rand()/(RAND_MAX/10)); j < jx; ++j )
s += 'A'-1+(rand()/(RAND_MAX/26));
cout << s << endl;
records.push_back(s);
}
sort(records.begin(), records.end());
copy( records.begin(), records.end(), ostream_iterator<string>(cout, " "));
Зачем рулонить кучу вещей и подвергать себя многочисленным дефектам, когда вы можете использовать инструменты, которые уже работают и делают то, что вы хотите?