aboutsummaryrefslogtreecommitdiff
path: root/5.7.0.c
diff options
context:
space:
mode:
authorsinanmohd <pcmsinan@gmail.com>2022-06-19 23:52:17 +0530
committersinanmohd <pcmsinan@gmail.com>2022-06-19 23:52:17 +0530
commit5d8b93385decf9e618ea44f3bcca232a17ce0582 (patch)
tree1d42c19479025ef72aee59760ac13582fb44a843 /5.7.0.c
parentff4846af7dea497d75af09acfa6c2c8ca48fd67e (diff)
add 5.7.0
Diffstat (limited to '5.7.0.c')
-rw-r--r--5.7.0.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/5.7.0.c b/5.7.0.c
new file mode 100644
index 0000000..0c165d7
--- /dev/null
+++ b/5.7.0.c
@@ -0,0 +1,112 @@
+/* malloc version */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define MAXLINES 5000
+
+char *lineptr[MAXLINES];
+
+int readlines(char *lineptr[], int max);
+void writelines(char *lineptr[], int max);
+void my_qsort(char *lineptr[], int left, int right);
+
+int
+main(void)
+{
+ int nlines;
+
+ if ((nlines = readlines(lineptr, MAXLINES)) > 0) {
+ my_qsort(lineptr, 0, nlines);
+ writelines(lineptr, nlines);
+ return 0;
+ } else {
+ printf("Err: lines, lines everywhere\n"); /* too much lines / input too big */
+ return 1;
+ }
+ return 0;
+}
+
+#define MAXLEN 1000
+int sneed_getline(char str[], int max);
+
+int
+readlines(char *lineptr[], int max)
+{
+ int len, nlines;
+ char* temp, line[MAXLEN];
+
+ for (nlines = 0; (len = sneed_getline(line, MAXLEN)) > 0; nlines++) {
+ if (nlines < max && (temp = malloc(len+1)) != NULL) {
+ strcpy(temp, line);
+ lineptr[nlines] = temp;
+ }
+
+ else
+ return -1;
+ }
+
+ return nlines;
+}
+
+void
+writelines(char *lineptr[], int max)
+{
+ while (max--)
+ printf("%s\n", *lineptr++);
+}
+
+int
+sneed_getline(char str[], int max)
+{
+ char input;
+ char *str_og;
+
+ str_og = str;
+
+ --max;
+ while (--max && (input = getchar()) != EOF && input != '\n')
+ *str++ = input;
+
+ /*
+ if (input == '\n' && max)
+ *str++ = input; */
+
+ *str = '\0';
+
+ return str - str_og;
+}
+
+void swap(char *lineptr[], int to, int from);
+
+void
+my_qsort(char *lineptr[], int left, int right)
+{
+ int i, last;
+
+ if (left >= right)
+ return;
+
+ swap (lineptr, left, (left+right)/2);
+
+ last = left;
+
+ for (i = left+1; i < right; i++)
+ if (strcmp(lineptr[i], lineptr[left]) < 0)
+ swap(lineptr, i, ++last);
+
+ swap(lineptr, left, last);
+ my_qsort(lineptr, left, last - 1);
+ my_qsort(lineptr, last + 1, right);
+}
+
+void
+swap(char *lineptr[], int to, int from)
+{
+ char *temp;
+
+ temp = lineptr[to];
+ lineptr[to] = lineptr[from];
+ lineptr[from] = temp;
+}