149 lines
2.6 KiB
C++
149 lines
2.6 KiB
C++
// vi: set ts=4
|
|
|
|
#include <assert.h>
|
|
#define Assert(e) assert(e)
|
|
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
//#include <iostream.h>
|
|
#include <stdio.h>
|
|
#include "vector.h"
|
|
|
|
#define ELEMENTS(s) (sizeof(s) / sizeof(s[0]))
|
|
|
|
void CreateString(char *str, vector<char> &s)
|
|
{
|
|
register char *ptr;
|
|
for (ptr = str; *ptr != '\0'; ptr++)
|
|
s.append(*ptr);
|
|
}
|
|
|
|
|
|
|
|
void StringCons(char *str, vector<char> &s)
|
|
{
|
|
register char *ptr;
|
|
for (ptr = strchr(str, '\0') - 1; ptr >= str; --ptr)
|
|
s.prepend(*ptr);
|
|
}
|
|
|
|
|
|
|
|
void StringPrint(vector<char> &s, FILE *o)
|
|
{
|
|
for (register int i = 0; i < s.length(); ++i)
|
|
fputc(s[i], o);
|
|
}
|
|
|
|
|
|
|
|
void RemoveChar(char ch, vector<char> &s)
|
|
{
|
|
int i = 0;
|
|
while (i < s.length())
|
|
if (s[i] == ch)
|
|
s.removeAt(i);
|
|
else
|
|
++i;
|
|
}
|
|
|
|
|
|
|
|
void InsertBefore(char newchar, char findchar, vector<char> &s)
|
|
{
|
|
for (register int i = 0; i < s.length(); ++i)
|
|
if (s[i] == findchar)
|
|
s.insertAt(i++, newchar);
|
|
}
|
|
|
|
|
|
vector<char> reverse(vector<char> &s)
|
|
{
|
|
if (s.length() <= 1)
|
|
return s;
|
|
else
|
|
return reverse(s(1, s.length())) + s[0];
|
|
}
|
|
|
|
|
|
|
|
void RadixSort(vector<char> &s)
|
|
{
|
|
vector<char> queue[256];
|
|
|
|
for (register const char *ptr = s.vec() + (s.length() - 1);
|
|
ptr >= s.vec();
|
|
--ptr)
|
|
queue[*ptr].append(*ptr);
|
|
|
|
s.reshape(0);
|
|
for (register int i = 0; i < ELEMENTS(queue); ++i)
|
|
s += queue[i];
|
|
}
|
|
|
|
|
|
void main()
|
|
{
|
|
int i;
|
|
char merge_q[2] = {'!', '?'};
|
|
vector<char> string_q;
|
|
|
|
CreateString("for thought", string_q);
|
|
StringCons("Food ", string_q);
|
|
|
|
fputs("List contents = ", stdout);
|
|
StringPrint(string_q, stdout);
|
|
fputc('\n', stdout);
|
|
|
|
string_q = reverse(string_q);
|
|
|
|
fputs("List reverse = ", stdout);
|
|
StringPrint(string_q, stdout);
|
|
fputc('\n', stdout);
|
|
|
|
string_q += vector<char>(merge_q, ELEMENTS(merge_q));
|
|
|
|
fputs("List merge = ", stdout);
|
|
StringPrint(string_q, stdout);
|
|
fputc('\n', stdout);
|
|
|
|
RemoveChar('o', string_q);
|
|
|
|
fputs("Remove 'o' = ", stdout);
|
|
StringPrint(string_q, stdout);
|
|
fputc('\n', stdout);
|
|
|
|
InsertBefore('%', 'u', string_q);
|
|
InsertBefore('&', 't', string_q);
|
|
|
|
fputs("u->%u, t->&t = ", stdout);
|
|
StringPrint(string_q, stdout);
|
|
fputc('\n', stdout);
|
|
|
|
RadixSort(string_q);
|
|
|
|
fputs("Sorted List = ", stdout);
|
|
StringPrint(string_q, stdout);
|
|
fputc('\n', stdout);
|
|
|
|
string_q.insertAt(3, '@');
|
|
string_q.insertAt(0, '@');
|
|
string_q.insertAt(string_q.length(), '@');
|
|
|
|
fputs("@ after '!' = ", stdout);
|
|
StringPrint(string_q, stdout);
|
|
fputc('\n', stdout);
|
|
|
|
while ((i = string_q.find('@')) >= 0)
|
|
string_q[i] = '*';
|
|
|
|
fputs("@ -> '*' = ", stdout);
|
|
StringPrint(string_q, stdout);
|
|
fputc('\n', stdout);
|
|
|
|
assert (string_q.find('Z') == -1);
|
|
assert (string_q.find('u') == 18);
|
|
|
|
// cout << "Remove '*' = " << string_q << endl;
|
|
}
|