第十周:结构体 + 指针 + 单链表

1.统计候选人得票

题目:

编程统计候选人的得票数。设计有3个候选人zhang,li,wang,且不区分大小写,10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人选民,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。

【样例输入】

zhang

li

wang

Wang

Li

Zhang

zhang

ZHANG

deng

Deng

【样例输出】

zhang 4

li 2

wang 2

Error 2

代码:

#include <iostream>
#include <string.h>
using namespace std;

struct candidate
{
    
    
    char name[10];
    int dp;
}CANDIDATE[4];

int main()
{
    
    
    char xm[20];
    strcpy(CANDIDATE[0].name,"ZHANG");
    strcpy(CANDIDATE[1].name,"LI");
    strcpy(CANDIDATE[2].name,"WANG");
    strcpy(CANDIDATE[3].name,"Error");
    CANDIDATE[0].dp = 0;
    CANDIDATE[1].dp = 0;
    CANDIDATE[2].dp = 0;
    CANDIDATE[3].dp = 0;

    while (cin >> xm){
    
    
        int len = strlen(xm);
        for(int i = 0; i < len; i ++)
        {
    
    
            if(xm[i] >= 'a' && xm[i] <= 'z')
            {
    
    
                xm[i] -= 32;
            }

        }
        bool flag = true;
        for(int j = 0; j < 3; j ++)
        {
    
    
            if(strcmp(CANDIDATE[j].name, xm) == 0)
            {
    
    
                CANDIDATE[j].dp ++;
                flag = false;
            }
        }
        if(flag)
        {
    
    
            CANDIDATE[3].dp ++;
        }

    }
    strcpy(CANDIDATE[0].name, "zhang");
    strcpy(CANDIDATE[1].name, "li");
    strcpy(CANDIDATE[2].name, "wang");
    cout << CANDIDATE[0].name << " " << CANDIDATE[0].dp << endl;
    cout << CANDIDATE[1].name << " " << CANDIDATE[1].dp << endl;
    cout << CANDIDATE[2].name << " " << CANDIDATE[2].dp << endl;
    cout << CANDIDATE[3].name << " " << CANDIDATE[3].dp << endl;
	return 0;
}

2.结构体数组的排序

题目:

请设计一个结构体存储学生的姓名、学号、英语成绩(ABCD)和数学成绩(百分制),请录入5个同学的成绩,原样输出后,再按照平均成绩从小到大进行排序后输出。英语成绩转换方法:A-90,B-80,C-70,D-60。
【要求】采用结构体数组存储数据,使用函数、循环等知识点,主函数需精炼,其他可自行拟定

【输入样例】

zhang 2001 A 80
WANG 2002 B 70
DENG 2004 D 99
LI 2003 A 88
QIAO 2005 A 76

【输出样例】

zhang 2001 A 80
WANG 2002 B 70
DENG 2004 D 99
LI 2003 A 88
QIAO 2005 A 76

WANG 2002 B 70 75
DENG 2004 D 99 79
QIAO 2005 A 76 83
zhang 2001 A 80 85
LI 2003 A 88 89

代码:

#include <iostream>
using namespace std;

struct student
{
    
    
    char name[100];
    int xh;
    char English;
    int math;
    int averge;
}stu[5];

void Read()
{
    
    
    int n = 0;
    while(cin >> stu[n].name)
    {
    
    
        cin >> stu[n].xh;
        cin >> stu[n].English;
        int sum = 0;
        switch(stu[n].English)
        {
    
    
            case 'A':sum += 90; break;
            case 'B':sum += 80; break;
            case 'C':sum += 70; break;
            case 'D':sum += 60; break;
        }
        cin >> stu[n].math;
        sum += stu[n].math;
        stu[n].averge = sum / 2;
        n ++;
    }
}

void show1()
{
    
    
    for(int i = 0; i < 5; i ++)
    {
    
    
        cout << stu[i].name << " ";
        cout << stu[i].xh << " ";
        cout << stu[i].English << " ";
        cout << stu[i].math << endl;
    }
    cout << endl;
}

void paixu()
{
    
    
    for(int i = 0; i < 5; i ++)
    {
    
    
        for(int j = 0; j < 5; j ++)
        {
    
    
            if(stu[i].averge < stu[j].averge)
            {
    
    
                swap(stu[j], stu[i]);
            }
        }
    }
}

void show2()
{
    
    
    for(int i = 0; i < 5; i ++)
    {
    
    
        cout << stu[i].name << " ";
        cout << stu[i].xh << " ";
        cout << stu[i].English << " ";
        cout << stu[i].math << " ";
        cout << stu[i].averge << endl;
    }
}

int main()
{
    
    
    Read();
    show1();
    paixu();
    show2();
	return 0;
}

3.单链表的创建

题目:

采用尾插法,建立一个包含5个结点的单向链表,每个结点包括:学号、姓名、性别、年龄。然后遍历该链表,进行数据的输出。

【输入形式】学生信息

【输出形式】遍历该链表的信息,请注意,尾插法创建的输出结果和输入一致,但是头插法创建的结果和输入刚好相反。

【样例输入】

1004 zhang f 18

1002 wang m 19

1003 zheng f 19

1001 wu m 20

1005 deng m 19

【样例输出】

1004 zhang f 18

1002 wang m 19

1003 zheng f 19

1001 wu m 20

1005 deng m 19

代码:

#include<iostream>
#include<stdlib.h>
using namespace std;

typedef struct student{
    
      //定义一个结构体;
    int xh;
    char name[100]; // 数组别忘了申请长度;
    char sex;
    int age;
    struct student* next;  //别忘了申请指针域;
}STUDENT;

STUDENT* Build()

{
    
    
    STUDENT*Pt ,*prePt ,*head;
    head = NULL;
    for(int i = 0; i < 5; i ++){
    
     // 输入多组数据时,用循环;
        Pt = (STUDENT*)malloc(sizeof(STUDENT)); //在函数里一定要申请空间;不然数据生存期短暂;
        if(Pt != NULL){
    
      //还要检验空间是否申请成功;
            cin>>Pt->xh;
            cin>>Pt->name;
            cin>>Pt->sex;
            cin>>Pt->age;
        }
        if(head == NULL){
    
    
            head = Pt;
            prePt = Pt; //一定要确定头指针指向;
        }
        else{
    
    
            prePt->next = Pt; //记得用尾针保存下一节点的地址;
            prePt = Pt; //移动pr指针;
        }

    }
    Pt->next = NULL;  //确定尾指针;
    return head; //返回头指针的地址;

}
int Output(STUDENT* head){
    
    
    while(head != NULL){
    
    
        cout<<head->xh<<" ";
        cout<<head->name<<" ";   //用while循环遍历!!!
        cout<<head->sex<<" ";
        cout<<head->age<<" ";
        head = head->next;
        cout<<endl;
    }
    return 0;
}
int main(){
    
    
    STUDENT *head;
    head = Build();
    Output(head);
    return 0;
}

4.链表的插入排序

题目:

建立一个5结点的单向链表,每个结点包括:学号、姓名、性别、年龄。对其进行排序,采用插入排序法,按学号从小到大进行排列。
【输入形式】学生信息
【输出形式】排序后的信息
【样例输入】

1004 zhang f 18

1002 wang m 19

1003 zheng f 19

1001 wu m 20

1005 deng m 19
【样例输出】

1001 wu m 20

1002 wang m 19

1003 zheng f 19

1004 zhang f 18

1005 deng m 19

【样例输入】

1002 wu m 20

1001 wang m 19

1004 zheng f 19

1005 zhang f 18

1003 deng m 19

【样例输出】

1001 wang m 19

1002 wu m 20

1003 deng m 19

1004 zheng f 19

1005 zhang f 18

代码:

#include<iostream>
#include<stdlib.h>
using namespace std;

struct Node{
    
    
    int xh;
    char name[100];
    char sex;
    int age;
    struct Node*next;
};

void Output(struct Node*head){
    
    
    Node*p = head;
    while(p != NULL){
    
    
    cout<<p->xh<<" ";
    cout<<p->name<<" ";
    cout<<p->sex<<" ";
    cout<<p->age<<" ";
    cout<<endl;
    p = p->next;
    }
}

int main(){
    
    
    struct Node*head = NULL;
    for(int i = 0; i < 5; i ++){
    
    
        struct Node*NewNode = (struct Node*)malloc(sizeof(struct Node));
        cin>>NewNode->xh;
        cin>>NewNode->name;
        cin>>NewNode->sex;
        cin>>NewNode->age;
        NewNode->next = NULL;
        if(head == NULL){
    
    
            head = NewNode;
        }
        else{
    
    
            struct Node*Order = head;
            struct Node*Preorder = head;
            while(Order!=NULL && NewNode->xh > Order->xh ){
    
    
                Preorder = Order;
                Order = Order->next;
            }
            if(Order == head){
    
    
                NewNode->next = head;
                head = NewNode;
            }
            else{
    
    
                NewNode->next = Order;
                Preorder->next = NewNode;
            }
        }
    }
    Output(head);
return 0;
}

5.两个链表的合并

题目:

定义两个同种单向链表(结点中包含一个整型数和一个指向本结点类型的指针),两个链表中的数据都已经从小到大排好序了,请编制程序,合并这两个有序链表。

【输入形式】两个链表的数据,以0作为输入结束

【输出形式】合并后的数据,重复的数据请删除。

【样例输入】

1 3 5 7 9 0

1 2 3 4 5 5 8 12 0
【样例输出】

1 2 3 4 5 7 8 9 12

代码:

#include<iostream>
#include<stdlib.h>
using namespace std;

struct num{
    
    
    int a;
    struct num*p;
};

int main(){
    
    
    struct num* head = NULL;
    struct num* pt = NULL;
    while(1){
    
    
        struct num*node = (struct num*)malloc(sizeof(struct num));
        cin>>node->a;
        if(node->a == 0) break;
        if(head == NULL){
    
    
            head = node;
            pt = node;
        }
        else{
    
    
            pt->p = node;
            pt = node;
        }
        pt->p = NULL;
    }
    while(1){
    
    
        struct num*node = (struct num*)malloc(sizeof(struct num));
        cin>>node->a;
        if(node->a == 0)break;
        struct num*order = head;
        struct num*preorder = head;
        while(order != NULL && node->a > order->a){
    
    
            preorder = order;
            order = order->p;
        }
        if(order == head){
    
    
            node->p = head;
            head = node;
        }
        else{
    
    
            node->p = order;
            preorder->p = node;
        }
    }
    struct num*order = head;
    struct num*preorder = head;
    while(order != NULL){
    
    
        if(order == head) {
    
    
            cout<<order->a<<" ";
            order = order->p;
        }
        else{
    
    
            if(order->a == preorder->a){
    
    
                preorder = preorder->p;
                order = order->p;
                continue;
            }
            cout<<order->a<<" ";
            preorder = preorder->p;
            order = order->p;
        }
    }
return 0;
}

欢迎提问,学弟学妹们加油~

Guess you like

Origin blog.csdn.net/qq_51800570/article/details/120900991