diff --git a/code/practise/17 指针的高级应用/01 显示一个月的提醒列表/readme.md b/code/practise/17 指针的高级应用/01 显示一个月的提醒列表/readme.md new file mode 100644 index 0000000..62bd09f --- /dev/null +++ b/code/practise/17 指针的高级应用/01 显示一个月的提醒列表/readme.md @@ -0,0 +1,5 @@ + #### 程序:显示一个月的提醒列表 + +前面我们把字符串存储在二维数组中,但是这可能会浪费空间。后面的教学中我们设想使用指针数组存储字符串,让一维数组的每个元素都指向一个字符串字面量。如果数组元素是指向动态分配的字符串的指针,那么是可以实现我们的设想的。 + +下面的程序对之前的程序作了小部分修改,修改的地方后面用注释注明了。 \ No newline at end of file diff --git a/code/practise/17 指针的高级应用/01 显示一个月的提醒列表/reminder.c b/code/practise/17 指针的高级应用/01 显示一个月的提醒列表/reminder.c new file mode 100644 index 0000000..8f50da5 --- /dev/null +++ b/code/practise/17 指针的高级应用/01 显示一个月的提醒列表/reminder.c @@ -0,0 +1,86 @@ +#include +#include +#include + +#define MAX_REMIND 50 +#define MSG_LEN 100 + + +int read_line(char str[], int read_num); + +int main(void) { + + char* reminders[MAX_REMIND]; // ʾ // change + char day_str[3];//ǰתΪַ + char msg_str[MSG_LEN + 1]; //ǰʾϢ + int day, num_remind = 0; // ں͵ǰʾ + int i, j; + + + for (;;) { + + if (num_remind == MAX_REMIND) { + printf("-- No space left --\n"); + break; + } + + printf("Enter day and reminder:"); + + scanf("%2d", &day); //ÿµֻʾɣֻ 2 ֶ + + if (day == 0) + break; + + sprintf(day_str, "%2d", day); // day "%2d" ĸʽд day_str ַС"%2d" ֤С10ռλҶ + read_line(msg_str, MSG_LEN); + + + // ѰҵǰʾӦ÷ŵʾǸλ + for (i = 0; i < num_remind; i++) { + // ˵ǰӦڴǰ + if (strcmp(day_str, reminders[i]) < 0) + break; + } + + // ǰʾ뵽ȷλ + for (j = num_remind; j > i; j--) { + reminders[j] = reminders[j - 1]; // change + } + + reminders[i] = (char*)malloc(sizeof(msg_str) + sizeof(day_str) + 1); // change + + // change + if (reminders[i] == NULL) { + printf("-- No space left --\n"); + break; + } + + strcpy(reminders[i], day_str); + strcat(reminders[i], msg_str);// պý day_str ƽȥĿַǵ + + num_remind++; + } + + printf("Day Reminder: \n"); + for (i = 0; i < num_remind; i++) + printf("%s\n", reminders[i]); + + + return 0; +} + + +int read_line(char str[], int read_num) { + + int ch, count = 0; + + while ((ch = getchar()) != '\n') { + if (count < read_num) { + str[count++] = ch; + } + } + + str[count] = '\0'; + + return count; +} diff --git a/code/practise/17 指针的高级应用/02 维护零件数据库(链表)/inventory2.c b/code/practise/17 指针的高级应用/02 维护零件数据库(链表)/inventory2.c new file mode 100644 index 0000000..92b61c2 --- /dev/null +++ b/code/practise/17 指针的高级应用/02 维护零件数据库(链表)/inventory2.c @@ -0,0 +1,234 @@ +#include +#include +#include"readline.h" + +#define NAME_LEN 20 + +typedef struct part { + int number; + char name[NAME_LEN + 1]; + int on_hand; + struct part* next; +}part; + + +void menu(); +part* find_part(part* head, int number); +void insert(part* head); +void search(part* head); +void update(part* head); +void print(part* head); + + +int main(void) { + + char code = 'a'; + part* head = (part*)malloc(sizeof(part)); + head->next = NULL; + + if (head == NULL) { + printf("Database establish failed\n"); + exit(EXIT_SUCCESS); + } + + menu(); + + for (;;) { + printf("Enter operation code: "); + scanf(" %c", &code); + while (getchar() != '\n') // skips to end of line + ; + switch (code) { + case 'i': insert(head); break; + case 's': search(head); break; + case 'u': update(head); break; + case 'p': print(head); break; + case 'q': return 0; + default: printf("Illegal code.\n"); break; + } + } + + + + + return 0; +} + +void menu() { + + printf(" ==================================\n"); + printf(" * *\n"); + printf(" * i: insert *\n"); + printf(" * s: search *\n"); + printf(" * u: undate *\n"); + printf(" * p: print *\n"); + printf(" * q: quit *\n"); + printf(" * *\n"); + printf(" ==================================\n"); +} + + +/********************************************************** +* +* find_part: Looks up a part number in the inventory +* array.Returns the array index if the part +* number is found;otherwise,return -1 +* +***********************************************************/ +part* find_part(part* head, int number) { + + part* cur; + + // ǰձ + for (cur = head->next; cur != NULL && cur->number > number; + cur = cur->next) + ; + + if (cur == NULL) + return NULL; + + if (cur->number == number) + return cur; + +} + + +/********************************************************** +* +* insert: Inserts the part into the database.Prints +* an error message and returns prematurely +* if the part already exists or the database +* is full. +* +***********************************************************/ +void insert(part* head) { + + int part_number; + part* cur, * prev, *new_part; + + + printf("Enter part number: "); + scanf("%d", &part_number); + + // Ѱ part_number ӦλãҪ cur Ӧñ cur ǰĽ prev + // ˳ѭcur == NULL ˵ͷβ + // cur->number > part_number ˵ ıظ + // Ӧ cur prev ֮µ ͷ + for (cur = head->next, prev = NULL;cur != NULL && cur->number < part_number ; + prev = cur, cur = cur->next) + ; + + // жıǷݿеظ + if (cur != NULL && cur->number == part_number) { + printf("Part already exists.\n"); + return; + } + + // ½ + new_part = (part*)malloc(sizeof(part)); + + // жǷɹ + if (new_part == NULL) { + printf("Database is full; can't add more parts.\n"); + return; + } + + + new_part->number = part_number; + printf("Enter part name: "); + read_line(new_part->name, NAME_LEN); + printf("Enter quantity on hand: "); + scanf("%d", &new_part->on_hand); + + // ķʽ + // Ϊʱ head вprev == NULL, cur == NULL + // Ϊգ + // ͷ壺 head (prev == NULL, cur != NULL) + // β壺 prev (prev != NULL, cur == NULL) + // ͨλò룺 prev (prev,cur Ϊ NULL) + new_part->next = cur; + + if (prev == NULL) + head->next = new_part; + else + prev->next = new_part; + +} + + +/************************************************************ +* +* search: Look up a part by the number user enters. +* If the part exists, prints the name and quantity +* on hand;if not, print an error message. +* +************************************************************/ +void search(part* head) { + + int number; + part* trg; + + printf("Enter part number: "); + scanf("%d", &number); + + trg = find_part(head, number); + + if (trg == NULL) { + printf("Part not found.\n"); + return; + } + + printf("Part name: %s\n", trg->name); + printf("Quantity on hand: %d\n", trg->on_hand); + +} + + +/************************************************************ +* +* update: Prompts user to enter a number. +* Print an error message if the part doesn't exist; +* otherwise,prompts the user to enter change in +* quantity on hand and updates the database. +* +************************************************************/ + +void update(part* head) { + + int number, change; + part* trg; + + printf("Enter part number: "); + scanf("%d", &number); + + trg = find_part(head, number); + + if (trg == NULL) { + printf("Part not found.\n"); + return; + } + + printf("Enter change in quantity on hand(- means minus): "); + scanf("%d", &change); + trg->on_hand += change; + +} + + +/************************************************************ +* +* print: Print a listing of all parts in the database, +* showing the part number,part name and quantity +* on hand.Parts are printed in the order in which +* they were entered into the database. +* +************************************************************/ + +void print(part* head) { + + + printf("Part Number Part Name Quantity on Hand\n"); + for (part* cur = head->next; cur != NULL; cur = cur->next) { + printf("%6d%20s%15d\n", cur->number, cur->name, cur->on_hand); + } +}