이 문제는 구조체를 안쓰고 그냥 했다.
(1)编写一函数,计算两个日期之间的时间差,并将其值返回。
日期以年、月、日表示。
“时间差”以天数表示。
注意考虑日期之间的闰年。
函数的输入参数为日期1和日期2,
函数的返回值为时间差,单位为天数。
(2)编写一程序,在主函数中输入两个日期,调用上述函数计算两个日期之间的时间差,并将结果输出。
为了计算简便,假设用户输入的日期1总是早于日期2。
#include<stdio.h>
const int Yn[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
const int Pn[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int YorP(int y) {
int answer;
if (y % 4 == 0) {
if (y % 100 == 0) {
if (y % 400 == 0) {
answer = 1;
}
else answer = 0;
}
else answer = 1;
}
else answer = 0;
return answer;
}
int cal_Date(int D1, int D2) {
int y1 = D1 / 10000;
int m1 = D1 % 10000 / 100;
int d1 = D1 % 10;
int y2 = D2 / 10000;
int m2 = D2 % 10000 / 100;
int d2 = D2 % 10;
int a1 = 0, a2 = 0;
for (int i = y1; i < y2; i++) {
if (YorP(i)) a2 += 366;
else a2 += 365;
}
for (int i = 0; i < m1 - 1; i++) {
if (YorP(y1)) a1 += Yn[i];
else a1 += Pn[i];
}
a1 += d1;
for (int i = 0; i < m2 - 1; i++) {
if (YorP(y2)) a2 += Yn[i];
else a2 += Pn[i];
}
a2 += d2;
return a2 - a1;
}
int main(void) {
int answer;
int D1, D2;
printf("input DATE1,DATE2:");
scanf_s("%d %d", &D1, &D2);
printf("answer:%d", cal_Date(D1, D2));
return 0;
}
실행화면
请定义一个描述学生基本信息的结构,包括姓名,学号,籍贯,身份证号,年龄,家庭住址,性别,联系方式等。编程:
a) 编写函数 input() , 输入学生人数,创建结构体数组,输入基本信息;
b) 编写函数 print(),输出全体学生记录信息;
c) 编写函数 search(), 检索一个指定的学生信息并返回给主函数, 并由主函数打印到屏幕上;
d) 编写主函数,完成input、print函数调用,输入一个学生学号,调用search 返回检索结果,打印结果信息。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _students {
char name[20];
char num[20];
char sex;
int age;
} students;
int input(students** pps) {
int n=0;
printf("input n:");
scanf_s("%d", &n);
*pps = malloc(sizeof(students) * n);
for (int i = 0; i < n; i++) {
printf("input name,num,age,sex:");
scanf_s("%s %s %d %c",(*pps+i)->name,20,(*pps+i)->num,20,&((*pps+i)->age),&((*pps+i)->sex));
//printf("%s %s %d %c", (*pps + i)->name, (*pps + i)->num, (*pps + i)->age, (*pps + i)->sex);
}
return n;
}
void print(students* ps ,int n) {
for (int i = 0; i < n; i++) {
printf("%d :%s %s %d %c \n",i+1, (ps + i)->name, (ps + i)->num, (ps + i)->age, (ps + i)->sex);
}
}
void search(students* ps, char num[],int n) {
for (int i = 0; i < n; i++) {
if (!strncmp((ps + i)->num, num, 20)) {
printf("search num info :%s %s %d %c \n", (ps + i)->name, (ps + i)->num, (ps + i)->age, (ps + i)->sex);
}
}
}
int main(void) {
int n;
students* ps;
char s_num[20];
n=input(&ps);
print(ps,n);
printf("input search number:");
scanf_s("%s", s_num, 20);
search(ps, s_num, n);
free(ps);
return 0;
}
실행화면
设节点结构:
链表结构:
编程。要求程序实现如下功能:
a) 链表生成。键盘输入学生信息,建立一个节点按学号递增有序的单链表A={a1,a2,..,an},比如包含5~10条记录; //假设输入的学号依次为 2010002,2010005,2010009,2010007,2010003,2010000,姓名自己随便定义
b) 节点计数。对单链表A={a1,a2,..,an}编写节点计数函数f,求单链表中的节点个数。主函数调用节点计数函数f,并将其返回值(整数)显示到屏幕;
c) 对单链表A={a1,a2,..,an}编写函数fv,将它倒序为A={an,an-1,..,a1};
d) 编写输出单链表函数list。每次操作(插入一个新节点或者倒序)之后,调用函数list,在屏幕上显示链表的全部记录数据。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _student {
struct student* next;
int num;
char name[20];
} student;
void addFirst(student *target,int num,char name[]) {
student* newNode = malloc(sizeof(student));
newNode->next= target->next;
target->next = newNode;
strcpy_s(newNode->name, 20, name);
newNode->num = num;
}
int f(student *target) {
student* curr;
curr= target->next;
int i = 1;
while (curr->next != NULL) {
i++;
curr = curr->next;
}
return i;
}
student* fv(student* target) {//연결리스트 역순 알고리즘 여러번 볼것
student* q, * p, * n;
q = target->next;
p = NULL;
n = NULL;
while (q != NULL) {
n = p;
p = q;
q = q->next;
p->next = n;
}
return p;
}
void list(student* target) {
student* curr = target->next;
while (curr != NULL) {
printf("%s %d \n", curr->name, curr->num);
curr = curr->next;
}
}
int main(void) {
int n,k;
int num;
char name[20];
printf("input n:");
scanf_s("%d", &n);
student* head=malloc(sizeof(student));
head->next = NULL;
for (int i = 0; i < n; i++) {
printf("input name num:");
scanf_s("%s %d \n", name, 20, &num);
addFirst(head, num, name);
}
list(head);
k = f(head);
printf("total %d students \n", k);
head->next = fv(head);
list(head);
student *curr = head->next;
while(curr!=NULL){// ㅁㅔ모리 해제 코드
struct *next = curr->next;
free(curr);
curr = next;
}
free(head);
return 0;
}
실행화면
编写一元多项式加法器,输入两个一元稀疏多项式,然后对它们进行加法操作。
在具体实现上,要求用线性链表形式来存储一个多项式,每个链表的节点包括两个成员变量,系数和指数(均为整数)。例如
说明:
(1) 每个链表节点都是根据需要动态创建的;
(2) 程序采用多函数形式来实现,至少包括创建链表、打印链表、加法函数等。
(3) 多项式系数可正、可负;指数肯定是非负整数,且按照递增顺序排列
输入格式:第一行是一个整数M,表示第一个多项式的项数。
接下来有M行,每行有两个整数ci和ei,分别表示第i项的系数和指数。
再接下来是输入第二个多项式,方法同第一个多项式输入。
输出格式:输出两个多项式相加的结果。第一行是整数K,表示新多项式的项数。
接下来有K行,每一行为两个整数,分别代表系数和指数。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct _pnm {
struct pnm* next;
int ci;
int ei;
} pnm;
void addNode(pnm* target,int ci,int ei) {
pnm* curr = malloc(sizeof(pnm));
pnm* temp = malloc(sizeof(pnm));
pnm* q;
if (target->next == NULL) {
curr->next = target->next;
curr->ci = ci;
curr->ei = ei;
target->next = curr;
}
else {
curr = target->next;
q = target;
while (curr != NULL) {
if ((curr->ei) > ei) {
q->next = temp;
temp->next = curr;
temp->ci = ci;
temp->ei = ei;
break;
}
else if ((curr->ei) == ei) {
curr->ci = curr->ci + ci;
break;
}
else {
q = curr;
curr = curr->next;
if (curr == NULL) {
temp->next = curr;
q->next = temp;
temp->ci = ci;
temp->ei = ei;
}
}
}
}
}
void print(pnm* target) {
pnm* curr = malloc(sizeof(pnm));
curr = target->next;
while (curr != NULL) {
printf("%d %d\n", curr->ci, curr->ei);
curr = curr->next;
}
}
void addPnm(pnm *head1,pnm *head2) {
pnm* curr2 = head2->next;
while (curr2 != NULL) {
addNode(head1, curr2->ci, curr2->ei);
curr2 = curr2->next;
}
}
int calPnm(pnm *target) {
pnm* curr = target->next;
int i =0;
while (curr!=NULL) {
i++;
curr = curr->next;
}
return i;
}
int main(void) {
int k,m,n;
int ci, ei;
pnm* head1 = malloc(sizeof(pnm));
pnm *head2= malloc(sizeof(pnm));
head1->next = NULL;
head2->next = NULL;
printf("input k:");
scanf_s("%d", &k);
for (int i = 0; i < k; i++) {
printf("input ci ei:");
scanf_s("%d %d", &ci, &ei);
addNode(head1, ci, ei);
}
printf("input m:");
scanf_s("%d", &k);
for (int i = 0; i < k; i++) {
printf("input ci ei:");
scanf_s("%d %d", &ci, &ei);
addNode(head2, ci, ei);
}
addPnm(head1, head2);
printf("%d: \n", calPnm(head1));
print(head1);
free(head1);
free(head2);
return 0;
}
실행결과
有N个同学,编号分别为1,2,3……,N,围成一圈,随便选定一个整数m,让大家按顺时针依次报数,报到m的同学便会从圈子中退出,从而被淘汰,直到最后剩下一个人。
编写函数使用链表实现上述循环淘汰功能。
编写一个程序测试上述函数的功能,要求用户能够任意输入N与m;程序输入最后剩下人的编号。
#include<stdio.h>
#include<stdlib.h>
typedef struct _link {
int num;
struct link* next;
} link;
void addNode(link *target,int i) {
link* curr = malloc(sizeof(link));
curr->next= target->next;
target ->next = curr;
curr->num = i;
}
void circleLink(link *target) {
link* head = malloc(sizeof(link));
link* curr = malloc(sizeof(link));
head = target->next;
curr = target->next;
while (curr->next != NULL) curr = curr->next;
curr->next = head;
}
int deleteNode(link *target,int m) {
link* curr = target->next;
link* p = target->next;
while (curr->num != m) {
p = curr;
curr = curr->next;
}
if (curr->next == p) {
p->next = NULL;
free(curr);
return 0;
}
else {
p->next = curr->next;
free(curr);
return 1;
}
}
int main(void) {
int n;
int flag = 1;
int m;
link* head = malloc(sizeof(link));
head->next = NULL;
link *answer = malloc(sizeof(link));
printf("input n:");
scanf_s("%d", &n);
for (int i = 0; i < n; i++) addNode(head, i + 1);
circleLink(head);
while (flag) {
printf("input m:");
scanf_s("%d", &m);
flag = deleteNode(head, m);
}
answer = head->next;
printf("%d", answer->num);
free(answer);
free(head);
return 0;
}
한번도 오류없이 나온 실행결과 감격 ㅜㅜ
실행결과