Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <malloc.h>
- #include <assert.h>
- #include <memory.h>
- typedef struct TNode {
- char m_Digit;
- struct TNode * m_Next;
- }TNODE;
- TNODE * createNode ( char digit, TNODE * next )
- {
- TNODE * n = (TNODE *) malloc (sizeof ( *n ));
- n -> m_Digit = digit;
- n -> m_Next = next;
- return n;
- }
- void deleteList (TNODE * l)
- {
- while (l)
- {
- TNODE * tmp = l -> m_Next;
- free (l);
- l = tmp;
- }
- }
- void initString(char * string, int len) {
- for (int i = 0; i < len; ++i) {
- string[i] = '\0';
- }
- }
- void stringReverse(char * string) {
- int size = (int)strlen(string);
- char * rev = (char*)malloc(size * sizeof(char));
- for (int i = 0; i < size; ++i) {
- rev[i] = string[size-i-1];
- }
- for (int i = 0; i < size; ++i) {
- string[i] = rev[i];
- }
- free(rev);
- }
- char * doubleArraySize(char * string, int * len) {
- int prevLen = (*len);
- (*len) = (*len) * 2;
- char * biggerString = (char*)malloc((*len) * sizeof(char));
- for (int i = 0; i < prevLen; ++i) {
- biggerString[i] = string[i];
- }
- for (int j = prevLen; j < (*len); ++j) {
- biggerString[j] = '\0';
- }
- free(string);
- return biggerString;
- }
- char * linkToString(TNODE * link, int * length) {
- int len = 100;
- char * string = (char*)malloc(len * sizeof(char));
- initString(string, len);
- int counter = 1;
- while (link) {
- string[counter-1] = link->m_Digit;
- if (counter == len) {
- string = doubleArraySize(string, &len);
- }
- counter++;
- link = link->m_Next;
- }
- (*length) = counter;
- // char * newString =
- stringReverse(string);
- // free(string);
- return string;
- }
- void maxOfThreeChars(char a, char b, char c, char * maxCandidates) {
- if (a == b && b == c) {
- return;
- }
- else if (a == b && c < a) {
- maxCandidates[0] = 'a';
- maxCandidates[1] = 'b';
- maxCandidates[2] = '\0';
- }
- else if (b == c && a < c) {
- maxCandidates[0] = 'b';
- maxCandidates[1] = 'c';
- maxCandidates[2] = '\0';
- }
- else if (a == c && b < c) {
- maxCandidates[0] = 'a';
- maxCandidates[1] = 'c';
- maxCandidates[2] = '\0';
- }
- else if (a > b && a > c) {
- maxCandidates[0] = 'a';
- maxCandidates[1] = '\0';
- maxCandidates[2] = '\0';
- }
- else if (b > a && b > c) {
- maxCandidates[0] = 'b';
- maxCandidates[1] = '\0';
- maxCandidates[2] = '\0';
- }
- else if (c > a && c > b) {
- maxCandidates[0] = 'c';
- maxCandidates[1] = '\0';
- maxCandidates[2] = '\0';
- }
- }
- void maxOfTwoChars(char a, char b, char * maxCandidates) {
- if (a == b) {
- return;
- }
- else if (a > b) {
- maxCandidates[1] = '\0';
- }
- else if (b > a) {
- maxCandidates[0] = maxCandidates[1];
- maxCandidates[1] = '\0';
- }
- }
- void minOfThreeChars(char a, char b, char c, char * maxCandidates) {
- if (a == b && b == c) {
- return;
- }
- else if (a == b && c > a) {
- maxCandidates[0] = 'a';
- maxCandidates[1] = 'b';
- maxCandidates[2] = '\0';
- }
- else if (b == c && a > c) {
- maxCandidates[0] = 'b';
- maxCandidates[1] = 'c';
- maxCandidates[2] = '\0';
- }
- else if (a == c && b > c) {
- maxCandidates[0] = 'a';
- maxCandidates[1] = 'c';
- maxCandidates[2] = '\0';
- }
- else if (a < b && a < c) {
- maxCandidates[0] = 'a';
- maxCandidates[1] = '\0';
- maxCandidates[2] = '\0';
- }
- else if (b < a && b < c) {
- maxCandidates[0] = 'b';
- maxCandidates[1] = '\0';
- maxCandidates[2] = '\0';
- }
- else if (c < a && c < b) {
- maxCandidates[0] = 'c';
- maxCandidates[1] = '\0';
- maxCandidates[2] = '\0';
- }
- }
- void minOfTwoChars(char a, char b, char * maxCandidates) {
- if (a == b) {
- return;
- }
- else if (a < b) {
- maxCandidates[1] = '\0';
- }
- else if (b < a) {
- maxCandidates[0] = maxCandidates[1];
- maxCandidates[1] = '\0';
- }
- }
- int max3(const char * aString, const char * bString, const char * cString, int len) {
- // get chars
- // compare every digit from most significant to least significant
- char a,b,c;
- char maxCandidates[4] = "abc";
- for (int i = 0; i < len; ++i) {
- a = aString[i], b = bString[i], c = cString[i];
- if (strlen(maxCandidates) == 3) {
- maxOfThreeChars(a,b,c,maxCandidates);
- }
- else if (strcmp(maxCandidates,"ab") == 0) {
- maxOfTwoChars(a,b,maxCandidates);
- }
- else if (strcmp(maxCandidates,"ac") == 0) {
- maxOfTwoChars(a,c,maxCandidates);
- }
- else if (strcmp(maxCandidates,"bc") == 0) {
- maxOfTwoChars(b,c,maxCandidates);
- }
- if (strlen(maxCandidates) == 1) {
- break;
- }
- }
- return (maxCandidates[0] - 'a' + 1);
- }
- int min3(const char * aString, const char * bString, const char * cString, int len) {
- char a,b,c;
- char minCandidates[4] = "abc";
- for (int i = 0; i < len; ++i) {
- a = aString[i], b = bString[i], c = cString[i];
- if (strlen(minCandidates) == 3) {
- minOfThreeChars(a,b,c,minCandidates);
- }
- else if (strcmp(minCandidates,"ab") == 0) {
- minOfTwoChars(a,b,minCandidates);
- }
- else if (strcmp(minCandidates,"ac") == 0) {
- minOfTwoChars(a,c,minCandidates);
- }
- else if (strcmp(minCandidates,"bc") == 0) {
- minOfTwoChars(b,c,minCandidates);
- }
- if (strlen(minCandidates) == 1) {
- break;
- }
- }
- return (minCandidates[0] - 'a' + 1); // 'a' - 'a' = 0, 0 + 1 = 1
- }
- int max2(char * aString, char * bString) {
- char a,b;
- char maxCandidates[3] = "ab";
- for (int i = 0; i < strlen(aString); ++i) {
- a = aString[i], b = bString[i];
- maxOfTwoChars(a,b,maxCandidates);
- if (strlen(maxCandidates) == 1) {
- break;
- }
- }
- return (maxCandidates[0] - 'a' + 1);
- }
- TNODE * median3( TNODE * a, TNODE * b, TNODE * c) {
- char * aString, * bString, *cString;
- int aLength = -1;
- int bLength = -2;
- int cLength = -3;
- aString = linkToString(a, &aLength);
- bString = linkToString(b, &bLength);
- cString = linkToString(c, &cLength);
- if (strcmp(aString,bString) == 0 ||
- strcmp(bString,cString) == 0 ||
- strcmp(aString,cString) == 0) {
- free(aString);free(bString);free(cString);return NULL;
- }
- if (aLength == bLength && bLength == cLength) {
- int min = min3(aString,bString,cString,aLength);
- int max = max3(aString,bString,cString,aLength);
- if (max != 1 && min != 1) {
- free(aString);free(bString);free(cString);return a;
- }
- if (max != 2 && min != 2) {
- free(aString);free(bString);free(cString);return b;
- }
- if (max != 3 && min != 3) {
- free(aString);free(bString);free(cString);return c;
- }
- }
- else if (cLength < aLength && aLength < bLength) {
- free(aString);free(bString);free(cString);return a;
- }
- else if (aLength < bLength && bLength < cLength) {
- free(aString);free(bString);free(cString);return b;
- }
- else if (bLength < cLength && cLength < aLength) {
- free(aString);free(bString);free(cString);return c;
- }
- else if (aLength == bLength && cLength > bLength) {
- int max = max2(aString, bString);
- if (max == 1) { free(aString);free(bString);free(cString);return a;}
- if (max == 2) { free(aString);free(bString);free(cString);return b;}
- }
- else if (cLength == bLength && aLength > bLength) {
- int max = max2(bString, cString);
- if (max == 1) { free(aString);free(bString);free(cString);return b;}
- if (max == 2) { free(aString);free(bString);free(cString);return c;}
- }
- else if (aLength == cLength && bLength > cLength) {
- int max = max2(aString, cString);
- if (max == 1) { free(aString);free(bString);free(cString);return a;}
- if (max == 2) { free(aString);free(bString);free(cString);return c;}
- }
- return a;
- }
- int main() {
- TNODE * a, * b,* c;
- TNODE * res;
- a = createNode('0',
- createNode('9',
- createNode('1', NULL)));
- b = createNode('8',
- createNode('5',
- createNode('2', NULL)));
- c = createNode('8',
- createNode('5',
- createNode('1', NULL)));
- res = median3(a,b,c);
- assert( res == a);
- deleteList(a);
- deleteList(b);
- deleteList(c);
- a = createNode('8',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('2', NULL)))))))))))))))))))));
- b = createNode('8',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('4',
- createNode('5',
- createNode('2', NULL)))))))))))))))))))));
- c = createNode('8',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('5',
- createNode('3',
- createNode('5',
- createNode('2', NULL)))))))))))))))))))));
- res = median3(a,b,c);
- assert(res == b);
- deleteList(a);
- deleteList(b);
- deleteList(c);
- a = createNode('1',NULL);
- b = createNode('2', createNode('1',NULL));
- c = createNode('3',createNode('1',createNode('2',NULL)));
- res = median3(a,b,c);
- assert(res == b);
- deleteList(a);
- deleteList(b);
- deleteList(c);
- a = createNode('1',createNode('1',NULL));
- b = createNode('1', createNode('1',NULL));
- c = createNode('3',createNode('1',createNode('2',NULL)));
- res = median3(a,b,c);
- assert(res == NULL);
- deleteList(a);
- deleteList(b);
- deleteList(c);
- a = createNode('1',createNode('1',NULL));
- b = createNode('2', createNode('1',NULL));
- c = createNode('3',createNode('1',createNode('2',NULL)));
- res = median3(a,b,c);
- assert(res == b);
- deleteList(a);
- deleteList(b);
- deleteList(c);
- a = createNode('6',createNode('5',createNode('3',createNode('4',createNode('1',NULL)))));
- b = createNode('6',createNode('5',createNode('5',createNode('5',createNode('1',NULL)))));
- c = createNode('7',createNode('6',createNode('4',createNode('5',createNode('1',NULL)))));
- res = median3(a,b,c);
- assert(res == c);
- deleteList(a);
- deleteList(b);
- deleteList(c);
- a = createNode('6',createNode('5',createNode('3',createNode('4',createNode('1',NULL)))));
- b = createNode('5',createNode('5',createNode('5',createNode('5',createNode('1',NULL)))));
- c = createNode('7',createNode('6',createNode('4',createNode('5',createNode('1',NULL)))));
- res = median3(a,b,c);
- assert(res == c);
- deleteList(a);
- deleteList(b);
- deleteList(c);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement