Skrifið ykkar eigin útgáfu af strchr fallinu í C. Fallið tekur inn streng og bókstaf og skilar bendi á fyrsta staðinn í strengnum þar sem bókstafurinn kemur fyrir eða NULL ef hann kemur hvergi fyrir í strengnum.
Notið beinagrindina hér fyrir neðan og útfærið mystrchr fallið. Ekki breyta main fallinu sem prófar mystrchr.
#include <stdio.h> #include <string.h> char *mystrchr(char *s, int c) { } int main(void) { char s[] = "Hello world"; if (mystrchr(s, 'w') == strchr(s, 'w')) printf("Test 1: Passed\n"); else printf("Test 1: Failed\n"); if (mystrchr(s, 'a') == NULL) printf("Test 2: Passed\n"); else printf("Test 2: Failed\n"); if (mystrchr(s, 'd') == strchr(s, 'd')) printf("Test 3: Passed\n"); else printf("Test 3: Failed\n"); if (mystrchr(s, 'H') == strchr(s, 'H')) printf("Test 4: Passed\n"); else printf("Test 4: Failed\n"); }
Skrifið fall í C sem brýtur upp strengi. Fallið tekur inn streng (null terminated) og fylki af bendum. Strengnum er skipt upp samkvæmt isspace þ.a. allir bókstafir c þar sem isspace(c) == 1 er skipt út fyrir núll-bæti. Bendarnir í fylkinu vísa síðan á byrjun hvers aðskilda hluta í skipta strengnum.
Notið beinagrindina hér fyrir neðan og útfærið split fallið. Ekki breyta main fallinu.
#include <stdio.h> #include <string.h> #define MAXARGS 32 // Notkun: n = split(s, argv, maxargs); // Fyrir: argv er fylki af stærð maxargs, þ.e. // argv[0..maxargs-1] er leyfilegt svæði // maxargs er heiltala >= 0 // Eftir: Búið er að brjóta strenginn s upp í n margra // strengi samkvæmt isspace. Strengirnir eru // í argv[0..n-1]. argv[i] vísar á streng númer i // í s, þ.e. argv[0] er fyrsti strengurinn, o.s.frv. // Öll gildi c í upphaflega strengnum sem uppfylltu // isspace(c) verða að null-bætum. int split(char *s, char *argv[], int maxargs) { } int main(void) { char s[] = "ab cd ef\t gh"; char *expected[] = {"ab", "cd", "ef", "gh", NULL}; char *argv[MAXARGS]; int argc; int i; argc = split(s, argv, MAXARGS); i = 0; while (expected[i] != NULL) { if (i >= argc) { printf("Test failed: Exceeded length\n"); return 1; } if (strcmp(argv[i], expected[i])) { printf("Test failed: Expected %s got %s\n", expected[i], argv[i]); return 1; } i++; } printf("Test passed\n"); return 0; }
Skrifið fall í C sem tekur inn bendi á haus fyrir eintengdan lista og skilar fjölda hlekkja í listanum.
Notið beinagrindina hér fyrir neðan og útfærið count fallið. Ekki breyta main fallinu.
#include <stdio.h> #include <stdlib.h> struct link { int n; struct link *next; }; int count(struct link *h) { } int main(void) { struct link *h1 = malloc(sizeof(struct link)); struct link *h2 = malloc(sizeof(struct link)); struct link *h3 = malloc(sizeof(struct link)); struct link *h4 = malloc(sizeof(struct link)); h4->n = 40; h4->next = NULL; h3->n = 30; h3->next = h4; h2->n = 20; h2->next = h3; h1->n = 10; h1->next = h2; if (count(NULL) == 0) printf("Test 1: Passed\n"); else printf("Test 1: Failed\n"); if (count(h4) == 1) printf("Test 2: Passed\n"); else printf("Test 2: Failed\n"); if (count(h3) == 2) printf("Test 3: Passed\n"); else printf("Test 3: Failed\n"); if (count(h2) == 3) printf("Test 4: Passed\n"); else printf("Test 4: Failed\n"); if (count(h1) == 4) printf("Test 5: Passed\n"); else printf("Test 5: Failed\n"); }
Skrifið fall í C sem tekur inn heiltölu og bendi á haus fyrir eintengdan lista og skilar hlekk sem inniheldur viðkomandi heiltölu (eða NULL ef ekkert finnst).
Notið beinagrindina hér fyrir neðan og útfærið search fallið. Ekki breyta main fallinu.
#include <stdio.h> #include <stdlib.h> struct link { int n; struct link *next; }; struct link *search(struct link *h, int k) { } int main(void) { struct link *h1 = malloc(sizeof(struct link)); struct link *h2 = malloc(sizeof(struct link)); struct link *h3 = malloc(sizeof(struct link)); struct link *h4 = malloc(sizeof(struct link)); h4->n = 40; h4->next = NULL; h3->n = 30; h3->next = h4; h2->n = 20; h2->next = h3; h1->n = 10; h1->next = h2; if (search(NULL, 10) == NULL) printf("Test 1: Passed\n"); else printf("Test 1: Failed\n"); if (search(h1, 10) == h1) printf("Test 2: Passed\n"); else printf("Test 2: Failed\n"); if (search(h1, 20) == h2) printf("Test 3: Passed\n"); else printf("Test 3: Failed\n"); if (search(h1, 30) == h3) printf("Test 4: Passed\n"); else printf("Test 4: Failed\n"); if (search(h1, 40) == h4) printf("Test 5: Passed\n"); else printf("Test 5: Failed\n"); if (search(h1, 50) == NULL) printf("Test 6: Passed\n"); else printf("Test 6: Failed\n"); }
Skrifið fall í C sem tekur inn bendi á haus fyrir eintengdan lista og snýr listanum við (án þess að búa til nýjan lista).
Notið beinagrindina hér fyrir neðan og útfærið reverse fallið. Ekki breyta main fallinu.
#include <stdio.h> #include <stdlib.h> struct link { int n; struct link *next; }; struct link *reverse(struct link *h) { } void printlist(struct link *h) { struct link *p = h; while (p != NULL) { printf("%d\n", p->n); p = p->next; } } int test(struct link *h, int f[], int n) { int i; for (i = 0; i < n; i++) { if (h == NULL) return 0; if (h->n != f[i]) return 0; h = h->next; } return 1; } int main(void) { struct link *p; int f[] = {40,30,20,10}; struct link *h1 = malloc(sizeof(struct link)); struct link *h2 = malloc(sizeof(struct link)); struct link *h3 = malloc(sizeof(struct link)); struct link *h4 = malloc(sizeof(struct link)); h4->n = 40; h4->next = NULL; h3->n = 30; h3->next = h4; h2->n = 20; h2->next = h3; h1->n = 10; h1->next = h2; printf("Before:\n"); p = h1; printlist(p); printf("After:\n"); p = reverse(h1); printlist(p); if (test(p, f, 4)) printf("Test passed\n"); else printf("Test failed\n"); }