Member Avatar for unsensible

ok so as a homework assignment I have to sort a c-string array alphabetically. We have to use pointers and cannot using strings (although strcopy and strcmp can be used). I can sort integers and strings but for the life of me cannot figure this out. I'm pretty sure i'm supposed to use some combination of strcmp and strcopy but i can't figure out where.

#include <iostream> using namespace std; // function to return a pointer to the smallest element in a sub-array char **smallest(char **a, int len) { // argument "a" points to the first element of a sub-array within the // caller's entire array. The first element of this sub-array is always // a[0] within "smallest", even though it's not the first element // of entire array in the caller. "smallest" knows nothing about array // elements before the start of the sub-array pointed to by argument "a". // The sub-array elements are effectively re-numbered, starting with 0, // within "smallest". Makes the code in smallest much simpler. char **small= &a[0]; // "small" points to the smallest element so far in // the sub-array. // scan rest of sub-array looking for smallest element. for (char i=1; i<len; i++) { // start on 2nd sub-array element, a[1]. if (a[i] < *small) // must dereference small to compare values // gets here if a[i] is smaller than smallest so far. small = &a[i]; // save pointer to this new smaller element. } // now small points to the smallest element in the sub-array pointed to by "a" return(small); } // function to swap 2 elements of an array using pointers to the 2 elements. // Notice no array indexing needed. void swap(char **x, char **y) { // x and y are pointers to elements to be swapped. // If they weren't pointers "swap" could not affect the caller's elements. char *temp= *x; // notice all pointers are dereferenced. *x = *y; *y = temp; } void selectionSort(char **array, int n) { // array pointer cannot be changed, but data can be changed. // n is length of array (cannot be changed). char **smallptr; // points to smallest element of a sub-array char **endptr = array+n-1; for (char **p= array; p<endptr; p++) { // this is iteration "j" // Select smallest element in sub-array starting at element array[j] int len = (endptr - p) + 1; smallptr= smallest(p, len); // Actual arguments to "smallest" (above) specify the sub-array starting // with element, array[j]. The "smallest" function knows // nothing about the array elements before array[j]. Within "smallest" // the sub-array elements are effectively re-indexed to start with 0. // Swap smallest element in sub-array with first element in // sub-array. i.e. element array[j] of entire array. swap(smallptr, p); } } int main() { const int len=5; char *strings[len] = {"mouse","cat","dog","zebra","ant"}; selectionSort(strings,len); // sort into alphabetical order // print out the words, now in alphabetical order for (int i=0;i<len;i++) cout<<strings[i]<<" "; cout<<endl; system("pause"); } 

The program runs it just doesn't change the string at all. Any help is greatly appreciated.

Member Avatar for unsensible

You know what, nevermind. I just figured it out almost as soon as i posted this lol.

in the smallest: if(strcmp(*small, a[i]) > 0) instead of if (a[i] < *small)

fixed everything. Thanks anyway guys

commented: For fixing your own problem. It's a good skill to have. :)+11
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.