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;
}
posted @ 2022-05-04 19:07  21CodeXin  阅读(498)  评论(0)    收藏  举报