?
1.定義一個(gè)結(jié)構(gòu)體變量(包括年、月、日)。計(jì)算該日在本年中是第幾天,注意閏年問題。
#include <stdio.h> struct date { int year; int month; int day; }d; int main() { int day[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; printf("請(qǐng)輸入年 月 日:\n"); scanf("%d%d%d", &d.year, &d.month, &d.day); int days = 0; for (int i = 1; i < d.month; i++) { days += day[i]; } days += d.day; if (d.year % 4 == 0 && d.year % 100 != 0 || d.year % 400 == 0) { if (d.month > 2) { days++; } } printf("該日在%d年%d月%d日是第%d天。\n", d.year, d.month, d.day, days); return 0; }
2.寫一個(gè)函數(shù)days,實(shí)現(xiàn)第1題的計(jì)算。由主函數(shù)將年、月、日傳遞給 days函數(shù),計(jì)算后將日子數(shù)傳回主函數(shù)輸出。
#include <stdio.h> struct date { int year; int month; int day; }d; int days(int year, int month, int day) { int day_tab[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; int day_sum = 0; for (int i = 1; i < d.month; i++) { day_sum += day_tab[i]; } day_sum += d.day; if (d.year % 4 == 0 && d.year % 100 != 0 || d.year % 400 == 0) { if (d.month > 2) { day_sum++; } } return day_sum; } int main() { printf("請(qǐng)輸入年 月 日:\n"); scanf("%d%d%d", &d.year, &d.month, &d.day); int day_sum = days(d.year, d.month, d.day); printf("該日在%d年%d月%d日是第%d天。\n", d.year, d.month, d.day, day_sum); return 0; }
3.編寫一個(gè)函數(shù) print,打印一個(gè)學(xué)生的成績(jī)數(shù)組,該數(shù)組中有5個(gè)學(xué)生的數(shù)據(jù)記錄,每個(gè)記錄包括 num, name, score[3],用主函數(shù)輸入這些記錄,用 print函數(shù)輸出這些記錄。
#include <stdio.h> #define N 5 struct student { char num[6]; char name[8]; int score[3]; }stu[N]; void print(struct student stu[6]) { printf("\n num name score1 score2 score3\n"); for (int i = 0; i < N; i++) { printf("%4s%6s", stu[i].num, stu[i].name); for (int j = 0; j < 3; j++) { printf("%8d", stu[i].score[j]); } printf("\n"); } } int main() { for (int i = 0; i < N; i++) { printf("請(qǐng)輸入第%d個(gè)學(xué)生的的成績(jī):>\n", i + 1); printf("num:"); scanf("%s", stu[i].num); printf("name:"); scanf("%s", stu[i].name); for (int j = 0; j < 3; j++) { printf("score %d:", j + 1); scanf("%d", &stu[i].score[j]); } printf("\n"); } print(stu); return 0; }
4.在第3題的基礎(chǔ)上,編寫一個(gè)函數(shù) input,用來輸入5個(gè)學(xué)生的數(shù)據(jù)記錄。
#include <stdio.h> #define N 5 struct student { char num[6]; char name[8]; int score[3]; }stu[N]; void print(struct student stu[6]) { printf("\n num name score1 score2 score3\n"); for (int i = 0; i < N; i++) { printf("%4s%6s", stu[i].num, stu[i].name); for (int j = 0; j < 3; j++) { printf("%8d", stu[i].score[j]); } printf("\n"); } } void input(struct student stu[]) { for (int i = 0; i < N; i++) { printf("請(qǐng)輸入第%d個(gè)學(xué)生的的成績(jī):>\n", i + 1); printf("num:"); scanf("%s", stu[i].num); printf("name:"); scanf("%s", stu[i].name); for (int j = 0; j < 3; j++) { printf("score %d:", j + 1); scanf("%d", &stu[i].score[j]); } printf("\n"); } } int main() { input(stu); print(stu); return 0; }
5.有10個(gè)學(xué)生,每個(gè)學(xué)生的數(shù)據(jù)包括學(xué)號(hào)、姓名、3門課程的成績(jī),從鍵盤輸入10個(gè)學(xué)生數(shù)據(jù),要求輸出3門課程總平均成績(jī),以及最高分的學(xué)生的數(shù)據(jù)(包括學(xué)號(hào)、姓名、3門課程成績(jī)、平均分?jǐn)?shù))。
#include <stdio.h> #define N 3 struct student { char num[6]; char name[8]; float score[3]; float avg; }stu[N]; int main() { for (int i = 0; i < N; i++) { printf("請(qǐng)輸入第%d個(gè)學(xué)生的的數(shù)據(jù):>\n", i + 1); printf("num:"); scanf("%s", stu[i].num); printf("name:"); scanf("%s", stu[i].name); for (int j = 0; j < 3; j++) { printf("score %d:", j + 1); scanf("%f", &stu[i].score[j]); } } //計(jì)算 float average = 0, max = 0; int maxi = 0; float sum = 0; for (int i = 0; i < N; i++) { sum = 0; for (int j = 0; j < 3; j++) { sum += stu[i].score[j];//計(jì)算第i個(gè)學(xué)生總分 } stu[i].avg = sum / 3.0;//計(jì)算第i個(gè)學(xué)生平均分 average += stu[i].avg; if (sum > max)//找分?jǐn)?shù)最高者 { max = sum; maxi = i;//將此學(xué)生的下標(biāo)保存在maxi } } average /= N;//計(jì)算總平均分?jǐn)?shù) printf("\n num name score1 score2 score3 average\n"); for (int i = 0; i < N; i++) { printf("%3.2s%6.2s", stu[i].num, stu[i].name); for (int j = 0; j < 3; j++) { printf("%8.2f", stu[i].score[j]); } printf("%8.2f\n", stu[i].avg); } printf("\naverage=%5.2f\n", average); printf("最高成績(jī)是:student %s, %s\n", stu[maxi].num, stu[maxi].name); printf("他的成績(jī)是:%6.2f,%6.2f,%6.2f,average:%5.2f\n", stu[maxi].score[0], stu[maxi].score[1], stu[maxi].score[2], stu[maxi].avg); return 0; }
6.13個(gè)人圍成一圈,從第1個(gè)人開始順序報(bào)號(hào)1,2,3。凡報(bào)到3者退出圈子。找出最后留在圈子中的人原來的序號(hào)。要求用鏈表實(shí)現(xiàn)。
#include <stdio.h> #define NUM 13 //定義節(jié)點(diǎn) typedef struct people { int num; struct people* next; }people; int main() { //定義包含13個(gè)人的數(shù)據(jù) people arr[NUM]; //建立環(huán)狀鏈表 people* head = arr; for (int i = 0; i < NUM; i++) { head->num = i + 1; head->next = &arr[i + 1]; head = head->next; } //構(gòu)成環(huán)狀鏈表 arr[NUM - 1].next = arr; //開始報(bào)數(shù) int count = NUM; //從1開始報(bào)數(shù) int i = 1; head = arr; while (count > 1) { //1.判斷是否已經(jīng)退出 if (head->next == 0) { //跳過此人 head = head->next; continue; } if (i == 3) { //當(dāng)前此人需要退出 printf("第%d個(gè)人退出\n", head->num); head->num = 0; count--; } //繼續(xù)報(bào)號(hào) i++; head = head->next; //判斷報(bào)號(hào)是否大于3 if (i > 3) { i = 1; } } //找出編號(hào)不為0的人 while (head->num == 0) { //找下一個(gè)人 head = head->next; if (head->num != 0) { printf("沒有退出的人為:%d\n", head->num); } } return 0; }
7. 在第9章例9.9和例9.10的基礎(chǔ)上,寫一個(gè)函數(shù)del,用來刪除動(dòng)態(tài)鏈表中指定的結(jié)點(diǎn)。
#include <stdio.h> #include <stdlib.h> typedef struct node { int num; struct node* next; }node; //創(chuàng)建鏈表:創(chuàng)建一個(gè)含有n個(gè)節(jié)點(diǎn)的鏈表,返回頭節(jié)點(diǎn)的指針 node* creat(int n) { //創(chuàng)建一個(gè)頭節(jié)點(diǎn) node* head = (node*)malloc(sizeof(node)); head->num = 0; head->next = NULL; node* p = head; //創(chuàng)建數(shù)據(jù)為1~n的節(jié)點(diǎn) for (int i = 1; i <= n; i++) { node* newNode = (node*)malloc(sizeof(node)); newNode->num = i; newNode->next = NULL; p->next = newNode; p = p->next; } return head; } //打印鏈表數(shù)據(jù) void printNode(node* head) { //第一個(gè)數(shù)據(jù)為head->next node* p = head->next; while (p != NULL) { printf("node %d\n", p->num); p = p->next; } } void del(node* head, int val) { node* prev = head; node* p = head; //遍歷鏈表,找到需要?jiǎng)h除的節(jié)點(diǎn) while (p != NULL) { if (p->num == val) { prev->next = p->next; free(p); break; } else { prev = p; p = p->next; } } } int main() { node* head = creat(10); int n; printf("當(dāng)前鏈表的所有節(jié)點(diǎn):\n"); printNode(head); printf("請(qǐng)輸入需要?jiǎng)h除的節(jié)點(diǎn)編號(hào):\n"); scanf("%d", &n); del(head, n); //刪除之后鏈表的節(jié)點(diǎn) printf("刪除之后鏈表的節(jié)點(diǎn):\n"); printNode(head); return 0; }
8. 寫一個(gè)函數(shù) insert,用來向一個(gè)動(dòng)態(tài)鏈表插入結(jié)點(diǎn)。
#include <stdio.h> #include <stdlib.h> typedef struct node { int num; struct node* next; }node; void insert(node* p, int n) { //創(chuàng)建節(jié)點(diǎn) node* newNode = (node*)malloc(sizeof(node)); newNode->num = n; //鏈接 newNode->next = p->next; p->next = newNode; } node* creat(int n) { //創(chuàng)建含有n個(gè)有效數(shù)據(jù)的節(jié)點(diǎn) //創(chuàng)建一個(gè)帶頭的鏈表 node* head = (node*)malloc(sizeof(node)); head->num = 0; head->next = NULL; node* p = head; //創(chuàng)建有效數(shù)據(jù)的節(jié)點(diǎn) for (int i = 1; i <= n; i++) { node* newNode = (node*)malloc(sizeof(node)); newNode->num = i; newNode->next = NULL; p->next = newNode; p = p->next; } return head; } void printNode(node* head) { //從第一個(gè)有效數(shù)據(jù)開始打印 node* p = head->next; while (p != NULL) { printf("node %d\n", p->num); p = p->next; } } int main() { int n; node* head = creat(10); printf("未插入數(shù)據(jù)之前的原始列表:\n"); printNode(head); printf("請(qǐng)輸入需要插入的數(shù)據(jù):\n"); scanf("%d", &n); insert(head, n); printf("插入數(shù)據(jù)之后的鏈表:\n"); printNode(head); return 0; }
9.綜合本章例9.9(建立鏈表的函數(shù) creat)、例9.10(輸出鏈表的函數(shù) print)和本章習(xí)題第7題(刪除鏈表中結(jié)點(diǎn)的函數(shù)dei)、第8題(插入結(jié)點(diǎn)的函數(shù) insert),再編寫一個(gè)主函數(shù),先后調(diào)用這些函數(shù)。用以上5個(gè)函數(shù)組成一個(gè)程序,實(shí)現(xiàn)鏈表的建立、輸出、刪除和插入,在主函數(shù)中指定需要?jiǎng)h除和插入的結(jié)點(diǎn)的數(shù)據(jù)。
#include <stdio.h> #include <stdlib.h> #define CNT 3 //定義節(jié)點(diǎn) typedef struct node { int num; struct node* next; }node; //創(chuàng)建鏈表:從控制臺(tái)輸入數(shù)據(jù) node* creat() { //首先創(chuàng)建一個(gè)頭節(jié)點(diǎn),不存放有效數(shù)據(jù) node* head = (node*)malloc(sizeof(node)); head->next = NULL; head->num = 0; node* p = head; printf("創(chuàng)建一個(gè)含有%d個(gè)數(shù)據(jù)的單鏈表\n", CNT); printf("請(qǐng)輸入%d個(gè)數(shù)據(jù):", CNT); for (int i = 0; i < CNT; i++) { int n; scanf("%d", &n); node* newNode = (node*)malloc(sizeof(node)); newNode->num = n; newNode->next = NULL; //鏈接 p->next = newNode; p = p->next; } return head; } //打印鏈表 void printNode(node* head) { node* p = head->next; while (p != NULL) { printf("node: %d\n", p->num); p = p->next; } } //刪除節(jié)點(diǎn) void del(node* head, int val) { //遍歷鏈表,找到待刪除的位置 node* p = head->next; node* prev = head; while (p != NULL) { if (p->num == val) { prev->next = p->next; free(p); break; } else { prev = p; p = p->next; } } } //插入節(jié)點(diǎn) void insert(node* p, int val) { //給p節(jié)點(diǎn)的后面插入新的數(shù)據(jù) node* newNode = (node*)malloc(sizeof(node)); newNode->num = val; newNode->next = NULL; newNode->next = p->next; p->next = newNode; } int main() { printf("創(chuàng)建鏈表:\n"); node* head = creat(); printf("創(chuàng)建鏈表結(jié)束:\n"); printf("初始鏈表:\n"); printNode(head); printf("請(qǐng)輸入需要插入的數(shù)據(jù):\n"); int n; scanf("%d", &n); insert(head, n); printf("插入數(shù)據(jù): %d之后,鏈表的所有數(shù)據(jù):\n",n); printNode(head); printf("請(qǐng)輸入需要?jiǎng)h除的數(shù)據(jù):\n"); scanf("%d", &n); del(head, n); printf("刪除數(shù)據(jù):%d之后,鏈表的所有數(shù)據(jù):\n", n); printNode(head); return 0; }
10.已有 a,b兩個(gè)鏈表,每個(gè)鏈表中的結(jié)點(diǎn)包括學(xué)號(hào)、成績(jī)。要求把兩個(gè)鏈表合并,按學(xué)號(hào)升序排列。
#include <stdio.h> #include <stdlib.h> #define NUM 5 typedef struct node { int num; float score; struct node* next; }node; node* creat() { printf("請(qǐng)輸入%d個(gè)數(shù)據(jù):學(xué)號(hào) 成績(jī)\n", NUM); node* head = NULL; //鏈表的表尾 node* tail = NULL; for (int i = 0; i < NUM; i++) { int num; float score; scanf("%d%f", &num, &score); //創(chuàng)建節(jié)點(diǎn) node* newNode = (node*)malloc(sizeof(node)); newNode->num = num; newNode->score = score; newNode->next = NULL; //插入到已有鏈表 //判斷當(dāng)前鏈表是否為空 if (head == NULL) { head = tail = newNode; } else { //把新的節(jié)點(diǎn)插入到尾節(jié)點(diǎn)后面 tail->next = newNode; tail = newNode; } } return head; } //合并,排序兩個(gè)鏈表 node* mergeList(node* a, node* b) { //合并 node* head = a; while (head->next != NULL) { head = head->next; } head->next = b; head = a; //prev:未排序的第一個(gè)節(jié)點(diǎn) node* prev = a; //排序,選擇排序 while (prev->next != NULL) { //每次從未排序的節(jié)點(diǎn)中選擇一個(gè)學(xué)號(hào)最小的 //放在第一個(gè)未排序節(jié)點(diǎn)的位置 node* cur = prev->next; while (cur) { if (prev->num > cur->num) { //把學(xué)號(hào)最小的數(shù)據(jù)往前移動(dòng) int num = prev->num; float score = prev->score; prev->num = cur->num; prev->score = cur->score; cur->num = num; cur->score = score; } cur = cur->next; } prev = prev->next; } return head; } void printNode(node* a) { while (a != NULL) { printf("學(xué)號(hào):%d 成績(jī):%f\n", a->num, a->score); a = a->next; } } int main() { node* a = creat(); node* b = creat(); printf("鏈表a的數(shù)據(jù):\n"); printNode(a); printf("鏈表b的數(shù)據(jù):\n"); printNode(b); printf("合并a和b\n"); a = mergeList(a, b); printNode(a); return 0; }
11.有兩個(gè)鏈表 a和b,設(shè)結(jié)點(diǎn)中包含學(xué)號(hào)、姓名。從a鏈表中刪去與b鏈表中有相同學(xué)號(hào)的那些結(jié)點(diǎn)。
#include <stdio.h> #include <stdlib.h> #define LEN 20 typedef struct node { int num; char name[LEN]; struct node* next; }node; //返回新鏈表的表頭 node* del(node* a, node* b) { node* head = a; //遍歷b中的每一個(gè)節(jié)點(diǎn) while (b) { //從a的表頭開始遍歷 node* prev = a; node* cur = prev->next; //用頭節(jié)點(diǎn)和b當(dāng)前指向的節(jié)點(diǎn)進(jìn)行比較 if (prev->num == b->num) { prev->next = NULL; //更新表頭 head = cur; } //用非頭節(jié)點(diǎn)和b當(dāng)前指向的節(jié)點(diǎn)進(jìn)行比較 else { while (cur) { if (cur->num == b->num) { //刪除當(dāng)前節(jié)點(diǎn) prev->next = cur->next; cur->next = NULL; break; } else { //繼續(xù)向后遍歷 prev = cur; cur = cur->next; } } } //處理b的下一個(gè)節(jié)點(diǎn) b = b->next; } return head; } void printNode(node* head) { while (head) { printf("%d-->%s\n", head->num, head->name); head = head->next; } } int main() { //建立鏈表 node a[5] = { {3, "zhang"}, {1, "wang"},{15, "li"},{10, "zhou"},{8, "ren"} }; node b[3] = { {8, "ren"}, {3, "zhang"}, {10, "zhou"}}; for (int i = 0; i < 5; i++) { a[i].next = &a[i + 1]; } a[4].next = NULL; for (int i = 0; i < 3; i++) { b[i].next = &b[i + 1]; } b[2].next = NULL; printf("鏈表a:\n"); printNode(a); printf("鏈表b:\n"); printNode(b); node* head = del(a, b); printf("刪除之后的鏈表:\n"); printNode(head); return 0; }
文章來源:http://www.zghlxwxcb.cn/news/detail-825362.html
12.建立一個(gè)鏈表,每個(gè)結(jié)點(diǎn)包括:學(xué)號(hào)、姓名、性別、年齡。輸入一個(gè)年齡,如果鏈表中的結(jié)點(diǎn)所包含的年齡等于此年齡,則將此結(jié)點(diǎn)刪去。
#include <stdio.h> #define LEN 20 typedef struct node { int num; char name[LEN]; char gender[LEN]; int age; struct node* next; }node; node* del(node* a) { int age; printf("請(qǐng)輸入需要?jiǎng)h除的年齡:\n"); scanf("%d", &age); //遍歷刪除 node* prev = NULL; node* cur = a; node* head = a; while (cur) { if (cur->age == age) { //當(dāng)前節(jié)點(diǎn)需要?jiǎng)h除 //頭節(jié)點(diǎn) if (prev == NULL) { //更新頭節(jié)點(diǎn) head = cur->next; } //非頭節(jié)點(diǎn) else { prev->next = cur->next; } //查看下一個(gè)節(jié)點(diǎn) cur = cur->next; } else { //當(dāng)前節(jié)點(diǎn)不需要?jiǎng)h除 prev = cur; cur = cur->next; } } return head; } void printNode(node* head) { while (head) { printf("%d %s %s %d\n", head->num, head->name, head->gender, head->age); head = head->next; } } int main() { node arr[] = { {1, "wang", "male", 20}, {2, "li", "female", 30}, {3, "zhang", "male", 20}, {4, "li", "female", 18}, {5, "cheng", "male", 20} }; //建立鏈表 for (int i = 0; i < 5; i++) { arr[i].next = &arr[i + 1]; } arr[4].next = NULL; printf("鏈表的所有數(shù)據(jù):\n"); printNode(arr); node* head = del(arr); printf("刪除之后鏈表的剩余數(shù)據(jù):\n"); printNode(head); return 0; }
文章來源地址http://www.zghlxwxcb.cn/news/detail-825362.html
到了這里,關(guān)于譚浩強(qiáng)【C語(yǔ)言程序設(shè)計(jì)】第九章習(xí)題詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!