定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。
写一个函数 days,实现第1题的计算。由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。
编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输入这些记录,用print函数输出这些记录。
在第3题的基础上,编写一个函数 input,用来输入5个学生的数据记录。
有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。
13个人围成一圈,从第1个人开始顺序报号1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。要求用链表实现。
在例1
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{long num;
float score;
struct Student * next;
};
int n;
struct Student * creat(void)//n为全局变量,本文件模块中各函数均可使用它
{struct Student * head;//定义函数。此函数返回一个指向链表头的指针
struct Student * p1, * p2;
n = 0;
p1=p2=(struct Student *)malloc(LEN); //开辟一个新单元
scanf("%ld,%f",&p1->num,&p1->score); //输入第1个学生的学号和成绩
head=NULL;
while(p1->num!=0)
{n=n+1;
if(n==1)head=p1;
else p2 -> next=p1;
p2=p1;
p1=(struct Student*)malloc(LEN);//开辟动态存储区,把起始地址赋给p1
scanf("%ld,%f",&p1->num,&p1->score);//输入其他学生的学号和成绩
}
p2->next=NULL;
return(head);
}
可以写一个main函数,调用这个creat函数:
int main()
{struct Student *pt;
pt=creat(); //函数返回链表第一个结点的地址
printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score); //输出第1个结点的成员值
return 0;
};
和例2
# include <stdio. h>
# include <stdlib. h>
# define LEN sizeof(struct Student)
struct Student //声明结构体类型 struct Studen
{long num;
float score; t
struct Student * next;
};
int n;//全局变量n
void print (struct Student * head) //定义 print 函数
{struct Student * p; //在函数中定义 struct Student 类型的变量
printf("\nNow, These %d records are: \n" , n) ;
p=head; //使p指向第1个结点
if(head!=NULL) //若不是空表
do
{printf("%ld %5. 1f\n" ;p->num, p->score) ;//输出一个结点中的学号与成绩
p=p>next;//p指向下一个结点
} while (p! =NULL);//当p不是“空地址”
}
的基础上,写一个函数del,用来删除动态链表中指定的结点。
写一个函数insert,用来向一个动态链表插入结点
综合例1#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{long num;
float score;
struct Student * next;
};
int n;
struct Student * creat(void)//n为全局变量,本文件模块中各函数均可使用它
{struct Student * head;//定义函数。此函数返回一个指向链表头的指针
struct Student * p1, * p2;
n = 0;
p1=p2=(struct Student *)malloc(LEN); //开辟一个新单元
scanf("%ld,%f",&p1->num,&p1->score); //输入第1个学生的学号和成绩
head=NULL;
while(p1->num!=0)
{n=n+1;
if(n==1)head=p1;
else p2 -> next=p1;
p2=p1;
p1=(struct Student*)malloc(LEN);//开辟动态存储区,把起始地址赋给p1
scanf("%ld,%f",&p1->num,&p1->score);//输入其他学生的学号和成绩
}
p2->next=NULL;
return(head);
}
可以写一个main函数,调用这个creat函数:
int main()
{struct Student *pt;
pt=creat(); //函数返回链表第一个结点的地址
printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score); //输出第1个结点的成员值
return 0;
};
例2# include <stdio. h>
# include <stdlib. h>
# define LEN sizeof(struct Student)
struct Student //声明结构体类型 struct Studen
{long num;
float score; t
struct Student * next;
};
int n;//全局变量n
void print (struct Student * head) //定义 print 函数
{struct Student * p; //在函数中定义 struct Student 类型的变量
printf("\nNow, These %d records are: \n" , n) ;
p=head; //使p指向第1个结点
if(head!=NULL) //若不是空表
do
{printf("%ld %5. 1f\n" ;p->num, p->score) ;//输出一个结点中的学号与成绩
p=p>next;//p指向下一个结点
} while (p! =NULL);//当p不是“空地址”
}
和第7题(删除链表中结点的函数del)、第8题(插入结点的函数insert),再编写一个主函数,先后调用这些函数。用以上5个函数组成一个程序,实现链表的建立、输出、删除和插入,在主函数中指定需要删除和插入的结点的数据。
已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。
有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点。
建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。