PTA作业(链表)--编程题
- 选民投票
编程统计候选人的得票数。有若干位候选人(n<=10),候选人姓名从键盘输入(候选人姓名不区分大小写,姓名最长为9个字节),若干位选民,选民每次输入一个得票的候选人的名字(姓名最长为9个字节),若选民输错候选人姓名,则按废票处理。程序自动统计各候选人的得票结果,并按照得票数由高到低的顺序排序。最后输出各选票人得票结果和废票信息。
输入格式:
先输入候选人人数n和n名候选人姓名,再输入选民人数m和m位选民的选票。
输出格式:
先根据选票结果由高到低输出各候选人得票结果,再根据废票情况输出废票信息(换行后,输出提示信息“invalid vote:”,再输出废票信息)。
输入样例1:3 zhang li wang 9 Wang Zhang zhuang LI Liao ZHANG WANG Wang wang输出样例1:
wang:4 zhang:2 li:1 invalid vote: zhuang Liao
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int n;
struct Person{
string name;
int tik;
};
bool cmp(Person a,Person b){
return a.tik>b.tik;
}
queue<string>q;
int main()
{
Person p[101];
cin>>n;
for(int i=0;i<n;i++){
cin>>p[i].name;
p[i].tik=0;
}
int tik_num;
cin>>tik_num;
string tic_name,invail;
for(int j=0;j<tik_num;j++){
cin>>tic_name;
invail=tic_name;
for(int i=0;i<tic_name.length();i++){
tic_name[i]=towlower(tic_name[i]);
}
int k;
int flag=1;
for(k=0;k<n;k++){
if(p[k].name==tic_name){
flag=1;
p[k].tik++;
break;
}
else{
flag=0;
}
}
if(flag==0){
q.push(invail);
}
}
sort(p,p+n,cmp);
for(int i=0;i<n;i++){
cout<<p[i].name<<":"<<p[i].tik<<endl;
}
if(q.size()>0){
cout<<endl;
cout<<"invalid vote:"<<endl;
}
while (q.size()>0)
{
cout<<q.front()<<endl;
q.pop();
}
return 0;
}
- 有理数均值
本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:4 1/2 1/6 3/6 -5/10输出样例1:
1/6
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main()
{
int temp,n;
cin>>n;
temp=n;
int sumzi=0,summu=1;
int fenzi,fenmu;
while(temp--){
scanf("%d/%d",&fenzi,&fenmu);
if(fenmu==0||fenzi==0)continue;
if(sumzi==0){
sumzi=fenzi;
summu=fenmu;
}
else{
sumzi=sumzi*fenmu+fenzi*summu;
summu=fenmu*summu;
}
int s1,s2;
if(temp==0)summu*=n;
s1=sumzi,s2=summu;
int yu=gcd(s1,s2);
sumzi/=yu;//及时处理,避免溢出
summu/=yu;
}
if(sumzi == 0) printf("0");
else if(summu != 1) printf("%d/%d", sumzi, summu);
else printf("%d", sumzi);
return 0;
}
- 成绩大于等于某值的学生信息输出
输入若干个学生信息(包括学号、姓名和成绩),输入学号为0时输入结束,建立一个单向链表,再输入一个成绩值,将成绩大于等于该值的学生信息输出。
提示:
定义函数struct stud_node *Creat_Stu_Doc()完成创建链表
定义函数struct stud_node *DeleteDoc(struct stud_node *head,int min_score)将分数低于min_score的结点删除
定义函数void Ptrint_Stu_Doc(struct stud_node *head)打印链表
输入输出示例:括号内为说明,无需输入输出
输入样例:1 zhang 78 2 wang 80 3 li 75 4 zhao 85 0 80输出样例:
2 wang 80 4 zhao 85
点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct Stu{
int num;
string name;
int score;
struct Stu *next;
};
Stu* create()
{
Stu *head=NULL,*p,*q;
while(1){
q= new Stu;
int numm;
cin>>numm;
if(numm==0)break;
q->num=numm;
cin>>q->name>>q->score;
q->next=NULL;
if(head==NULL){
head=p=q;
}
else{
p->next=q;
p=q;
}
}
return head;
}
Stu *Delete(Stu* head,int min_score)
{
Stu *p, *q;
while(head!=NULL && head->score<min_score)//先删除头结点满足的情况
{ //使头结点不能再删;
p=head;
head=head->next;
delete p;
}
if(head==NULL)//判断头结点是否为空,如果为空则链表为空
return NULL;
p=head;
q=head->next;
while(q!=NULL) //删除除过头结点之外的可删的结点
{
if(q->score<min_score)
{
p->next=q->next;
delete q;
}
else
p=q;
q=p->next;
}
return head;
}
void Print(Stu* head){
Stu* p;
p=head;
while(p){
cout<<p->num<<" "<<p->name<<" "<<p->score;
cout<<endl;
p=p->next;
}
}
int main()
{
Stu* head;
head=create();
int sc;
cin>>sc;
head=Delete(head,sc);
Print(head);
return 0;
}
- 单向链表3
编程实现:输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入一个正整数 n(0<n<=9)和一组(n个)升序的整数,建立单向链表,再输入一个整数 x,把 x 插入到这组数据中,使该组数据仍然有序。
输入输出示例:括号内为说明
输入样例:4 (repeat=4) 5 (数据的个数n=5) 1 2 4 5 7 (5个有序整数) 3 (待插入整数x=3) 4 (数据的个数n=4) 1 2 5 7 (4个有序整数) -10 (待插入整数x=-10) 3 (数据的个数n=3) 1 2 4 (3个有序整数) 100 (待插入整数x=100) 5 (数据的个数n=5) 1 2 4 5 7 (5个有序整数) 4 (待插入整数x=4)输出样例:
size=6:1 2 3 4 5 7 size=5:-10 1 2 5 7 size=4:1 2 4 100 size=6:1 2 4 4 5 7
点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct Node{
int data;
struct Node *next;
};
Node* create(int num){
Node* head=NULL,*p,*q;
while (num--)
{
p=new Node;
int dataa;
cin>>dataa;
p->data=dataa;
p->next=NULL;
if(head==NULL){
head=q=p;
}
else{
q->next=p;
q=p;
}
}
return head;
}
Node* insert(Node* head,int x){
Node*p,*q;
if(head->data>x){
q=new Node;
q->data=x;
q->next=head;
head=q;
return head;
}
p=head;
while (p!=NULL)
{
if(p->next==NULL||p->next->data>x){
q=new Node;
q->data=x;
q->next=p->next;
p->next=q;
break;
}
p=p->next;
}
return head;
}
void Print(Node *head){
Node *p;
p=head;
while(p!=NULL){
if (p->next == NULL) {
cout<<p->data;
}
else {
cout << p->data << " ";
}
p = p->next;
}
}
int main()
{
int repeat;
cin>>repeat;
while(repeat--){
Node* head;
int num;
cin>>num;
head=create(num);
int x;
cin>>x;
head=insert(head,x);
cout<<"size="<<num+1<<":";
Print(head);
cout<<endl;
}
}
- 链表也简单final
将学生成绩绩点组成一个链表。链表结构如下:
struct student {
string name; //学生姓名
double gpa; //绩点
student *next;
};
输入是一组学生的姓名和绩点,以链表形式存储。 删除绩点小于平均绩点的学生结点,成为一个新链表。 后按照输入的顺序,依序输出新链表的学生信息。平均绩点是输入的所有学生绩点取算术平均值。
输入格式:
输入包括若干行。 每行是一个学生的 姓名和绩点,以空格隔开。
最后一行是-1。
输出格式:
输出包括学生姓名。 每个学生姓名一行。
输入样例:zhang 3.5 liu 2.1 tie 1.9 -1输出样例:
zhang
点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct student{
string name;
double fpa;
student* next;
};
double sum=0;
int n=0;
student* create(){
student* head=NULL,*p,*q;
while (1)
{
p=new student;
string a;
cin>>a;
if(a[0]=='-')break;
(p->name).assign(a);
cin>>p->fpa;
p->next=NULL;
sum+=p->fpa;
n++;
if(head==NULL)
head=q=p;
else{
q->next=p;
q=p;
}
}
return head;
}
student* Delete(student* head,double avg){
student *p1 ,*p2;
while(head!=NULL&&head->fpa<avg){
p1=head;
head=head->next;
free(p1);
}
p1=head;
p2=head->next;
while(p2!=NULL){
if(p2->fpa<avg){
p1->next=p2->next;
free(p2);
}
else
p1=p2;
p2=p1->next;
}
return head;
}
void Print(student* head){
student* p;
p=head;
while(p){
cout<<p->name<<endl;
p=p->next;
}
}
int main()
{
student* head;
head=create();
double avg=sum/(n*1.0);
head=Delete(head,avg);
Print(head);
return 0;
}

浙公网安备 33010602011771号