PTA作业(链表)--函数题

  • 统计子串在母串出现的次数
    编写一个函数,该函数可以统计一个长度为3的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为:asdasasdfgasdaszx67asdmklo,字符串为:asd,则应输出n=4。
点击查看代码
#include<stdio.h>
int fun(char *str,char *substr);
int main()
{ char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
 int n;
 n=fun(str,substr);
 printf("n=%d\n",n);
 return 0;
}
/* 请在这里填写答案 */
int fun(char *str,char *substr)
{
    int count=0;int j,k=1;
    for(int i=0;str[i]!='\0';i++){
        if(str[i]==substr[0]){
            i++;
            for(j=1;j<3;j++){
                if(str[i]==substr[j]){
                    i++; k++;
                    if(k==3)break;
                }
                else  break;
            }
            if(k==3)count++;
            k=1;
        }
    }
    return count;
}
  • 存在感
    给定函数 frequency 的功能是:求字符串(子串)在字符串(一个段落)中出现的次数。
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int frequency ( char* paragraph, char* from, char* to );
int main()
{
    int N;
    char *s;
    int from,to;
    int freq;
    scanf("%d\n",&N);
    s = (char *)malloc((N+1)*sizeof(char));
    gets(s);
    scanf("%d %d", &from, &to);

    freq = frequency ( s, s+from-1, s+to-1 );

    printf("%d\n",freq);
    return 0;
}

/* 您提交的代码将放置在这里 */
int frequency ( char* paragraph, char* from, char* to ){
    int count=0,i,j,flag;
    for(i=0;paragraph[i]!='\0';i++){
        if(paragraph[i]==*from){
            flag=1;
            for(j=1;j<(to-from+1);j++){
                if(paragraph[i+j]!=*(from+j)){
                    flag=0;break;
                }
            }
            if(flag==1)count++;
        }
    }
    return count;
}
  • 本题要求求出单链表值最大的结点并返回。要求实现两个函数。
    本题要求求出单链表值最大的结点并返回。要求实现两个函数。其中arr存放创建单链表所需的数据(均为正整数),n 的值不超过1000; head 为不带附加头结点的单链表的头指针。
点击查看代码
#include <stdio.h>
#include <stdlib.h>

struct Node {
    int data;
    struct Node* next;
};

/* 建立单链表并返回单链表的头指针 */
struct Node* buildLinkedList(int* arr, int n);

/* 求单链表值最大的结点 */
struct Node* getMax(struct Node* head);

int main(int argc, char const *argv[]) 
{
    int *a, n, i;
    scanf("%d", &n);
    a = (int*)malloc(n * sizeof(int));
    for (i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }

    struct Node* head = NULL;
    head = buildLinkedList(a, n);
    struct Node* pMax = getMax(head);
    if (pMax)
        printf("%d\n", pMax->data);
    else
        printf("-1\n");
    free(a);
    return 0;
}
/* 请在这里填写答案 */
struct Node* buildLinkedList(int* arr, int n){  
    struct  Node* head,*p,*q;  
    head=NULL;  
    if(n==0)return head;  
    for(int i=0;i<n;i++){  
        p=(struct Node*)malloc(sizeof(struct Node));  
        p->data=arr[i];  
        p->next=NULL;  
        if(i==0){  
            head=q=p;  
        }  
        else{  
            q->next=p;  
            q=p;  
        }  
    }  
    return head;  
}  
  
struct Node* getMax(struct Node* head){  
    struct Node* pmax,*p;  
    pmax=head;  
    p=head;  
    if(head==NULL){  
        return NULL;  
    }  
    while(p!=NULL){  
        if(p->data>pmax->data){  
            pmax=p;  
        }  
        p=p->next;  
    }  
    return pmax;  
} 
  • 查找学生链表
    本题要求将键盘输入的学生信息创建成单向链表,并在学生信息链表中查找学生信息。
20180002 王红
20180006 张勇
20180008 吴涛
20170010 林玉
-1 xx
20180002
点击查看代码
#include <bits/stdc++.h>
using namespace std;
List * CreateList(); 
List * Find(List *head, int no) 
struct List{
  int sno;    
  char sname[10];
  List *next;
}; 
int main(void){
    List *list=NULL,*p;
    int no;
    list=CreateList();
    while(~scanf("%d", &no))
    {
        p=Find(list,no);
        if( p ) printf("%s\n", p->sname);
        else printf("Not Found!\n");
    }
    return 0;
}
/* 请在这里填写答案 */
List * CreateList(){
   List* head=NULL,*p1,*p2;
   while(1){
       p1= new(List);
        scanf("%d",&p1->sno);
        scanf("%s",p1->sname);
       if(p1->sno==-1)break;
       if(head==NULL){
           head=p2=p1;
       }
       else{
           p2->next=p1;
           p2=p1;
           p2->next=NULL;
       }
   }
   return head;
}
List * Find(List *head, int no){
    List *p1=head;
    while(p1!=NULL&&p1->sno!=no){
        p1=p1->next;
    }
    return p1;
} 
  • 工作备忘录的生成(链表)
    每天都要处理很多事务,为了更好地安排工作,希望在每天开始工作前,根据工作记录,生成工作备忘录。首先输入工作记录数(大于0的一个整数),再逐条输入各条工作记录,每条工作记录包括:工作名,开始时间,结束时间。假设每项工作的开始时间均小于它的结束时间,并且各项工作的开始时间互不相同。
    我们的工作是需要把这些工作记录按开始时间排序并输出,在输出时,如果某项工作与若干项工作冲突(在做该项工作时,需要同时做其它工作),则在该工作名前加'*'。
输入样例:
4
aaa 19 20
ccc 169 200
ddd 153 170
bbb 20 111
输出样例:
aaa 19 20
bbb 20 111
*ddd 153 170
*ccc 169 200
点击查看代码
#include<iostream>
#include <string>
using namespace std;
struct Node{
    string name;
    int start;
    int end;
    Node *next;
};
Node* add(Node *, Node *);
void display(Node *);
bool check(Node *head)
{
    if(head==NULL || head->next==NULL) return true;
    Node *p=head->next;
    if(head->start > p->start) return false;
    return check(p);
}
int main()
{
    Node *head=NULL, *p;
    int i, repeat;
    cin>>repeat;
    for(i=0;i<repeat;i++){
        p = new Node;
        cin>>p->name>>p->start>>p->end;
        p->next=NULL;
        head = add(head, p);
    }
    if(!check(head)) cout<<"ERROR"<<endl;
    display(head);
    return 0;
}

/* 请在这里填写答案 */
Node* add(Node *head, Node *newnode){
    if(head==NULL){
        head=newnode;
        return head;
    }
    Node *k=head,*p=NULL;
    while(k!=NULL&&k->start<newnode->start){
        p=k;
        k=k->next;
    }
    if(k==head){
        newnode->next=head;
        return newnode;
    }
    p->next=newnode;
    newnode->next=k;
    return head;
   
}
void display(Node *head)
{
    Node *p, *q;
    p = head;
    int flag;
    while (p != NULL)
    {
        flag = 0;
        q = head;
        while (flag == 0 && q != p)
        {
            if (q->end > p->start)
            {
                flag = 1;
                break;
            }
            q = q->next;
        }
        q = q->next;
        while (flag == 0 && q != NULL)
        {
            if (p->end > q->start)
            {
                flag = 1;
                break;
            }
            q = q->next;
        }
        if (flag == 1)
            cout << "*";
        cout <<p->name<<" "<<p->start<<" "<<p->end<<endl;
        p=p->next;
    }
}
  • 2018Final链表(龙舟队)
    现在用一个单链表来存储龙舟队成员的信息,每个成员信息包括是否为鼓手, 编号(所有成员的编号不相同)和年级:
    链表中按先鼓手,后一般队员的顺序存储队员信息。如果有多个鼓手,则按他们的编号排序,编号较小者在前;一般队员也按编号从小到大的规则排序。
    在自动选择鼓手时,优先选择年级最高的,如果有多位队员同时具有最高的年级号,则选择其中编号最小的那位作鼓手。
    输入时,首先输入若干名队员信息,每条信息包括3项:是否鼓手(0否,1是),编号,年级。当输入-1时结束输入初始信息。接着,进行队员增减操作,每次增减操作最多可能包括4项:第一项为操作类型(0为减少,1为增加,-1为终止操作),如果第1项为-1,则终止输入;如果第1项为0,则输入离开的成员的编号(假设所输入的编号肯定在当前龙舟队中);如果第1项为1时,则输入新队员的3项信息:是否鼓手(0否,1是),编号(假设新加入成员的编号不会与现有成员相同),年级。
    输出:在每次增减操作后,均输出当前龙舟队的前3位成员的信息(假设在建立链表后,任意时刻该链表中的结点数量均不会小于3)。

输入样例:

1 0 7
0 5 9
0 3 8
0 16 8
1 20 9
-1
0 0
0 20
-1

输出样例:

20 3 5
5 3 16
点击查看代码
#include <iostream>
using namespace std;
Player *create();//建立链表
Player* addPlayer(Player* head, Player* q);//加链表里加入q指向的结点
Player* removePlayer(Player *head, int num);//从链表里删除编号为num的结点,如果删除导致缺少鼓手则自动选择一位新鼓手
struct Player{
   bool drummer;
   int num;
   int grade;
   Player* next;
};
void print(Player *head){
    Player *p=head;
    cout<<p->num<<' ';
    p=p->next;
    cout<<p->num<<' ';
    p=p->next;
    cout<<p->num<<endl;    
}
#include<algorithm>
int cmp1(Player a, Player b)
{
    if(a.drummer == b.drummer)
        return a.num < b.num;
    else
        return a.drummer > b.drummer;
}
 
int cmp2(Player a,Player b)
{
    if(a.grade == b.grade)
        return a.num < b.num;
    else
        return a.grade > b.grade;
}
 
Player a[10010];
int i;
Player *create()//建立链表
{
    Player *head = NULL;
    int num;
    for(i = 0;;i++)
    {
        cin>>num;
        if(num == -1)
            break;
        else
        {
            a[i].drummer = num;
            cin >> a[i].num >> a[i].grade;
            a[i].next = &a[i + 1];
        }
    }
    sort(a,a+i,cmp1);//初步排序
    if(a[0].drummer == 0)
    {
        sort(a,a+i,cmp2);//没有鼓手 选取高年级,并且如果同年级编号小的在前面,作为鼓手
        a[0].drummer = 1;//排第一的赋值为1;
        sort(a, a + i, cmp1);
    }
    for (int j = 0; j < i; j++)
    {
        a[j].next = &a[j + 1];
    }
    a[i - 1].next = NULL;
    head = &a[0];
    return head;
}
 
Player* addPlayer(Player* head, Player* q)//加链表里加入q指向的结点
{
    a[i-1].next = &a[i];
    a[i].drummer = q->drummer;
    a[i].num = q->num;
    a[i].grade = q->grade;
    i++;
    sort(a, a+i, cmp1);//排序后创建新链表
    for (int j = 0; j < i; j++)
    {
        a[j].next = &a[j + 1];
    }
    a[i - 1].next = NULL;
    head = &a[0];
    return head;
}
 
Player* removePlayer(Player *head, int num)//从链表里删除编号为num的结点,如果删除导致缺少鼓手则自动选择一位新鼓手
{
    for (int j = 0; j < i; j++)
    {
        if (a[j].num == num)
        {
            a[j].drummer = 0;
            a[j].num = 9999999;
            a[j].grade = -1;
        }
    }
    sort(a, a + i, cmp1);
    if (a[0].drummer == 0)
    {
        sort(a, a + i, cmp2);
        a[0].drummer = 1;
        sort(a, a + i, cmp1);
    }
    for (int j = 0; j < i; j++)
    {
        a[j].next = &a[j + 1];
    }
    a[i - 1].next = NULL;
    head = &a[0];
    return head;
}
/* 请在这里填写答案 */

int main(){
    Player *head=NULL;
    int task, d, num, grade;
    head=create();
    while(1){
        cin>>task;
        if(task<0) break;
        if(task==1){
            Player*q = new Player;
            cin>>d>>q->num>>q->grade;
            if(d==1) q->drummer=true; else q->drummer=false;
            q->next = NULL;
            head=addPlayer(head, q);
        } 
        if(task==0){
            cin>>num;
            head=removePlayer(head, num);
        } 
        print(head);
    }
    return 0;    
}

  • ** 单链表(流浪狗收养所)**
    单链表(流浪狗收养所)
    怡山小学生物组的同学在课外要收养一批流浪狗。在流浪狗进入收养基地时,课外指导老师会给每一只狗取一个唯一的编号,并且判定它的年龄,让组长输入流浪狗档案。档案以单链表存储,按年龄为序(从小到大),如果年龄相同,则后录入的记录应该放在前面。
    由于组里新来了一位二年级的淘气组员小林,喜欢将已经输入的档案再次输入。他在输入时,会输入正确的编号,却可能输入错误的年龄(但他所输入的年龄不会大于真实的年龄),因此在输入档案外,组长还需要对档案进行清理,清除那些重复档案。
    输入时:首先输入任务类型:1代表插入新的记录, 2代表清理档案, 0代表退出。如果需要加入新的记录,则接下来将依次输入编号和年龄。
    输出时:按照从前到后的顺序输出档案中的所有的记录,每条记录单独占一行。

输入样例:

1 abcd 2
1 cd 5
1 cd 4
1 zz 4
2
0

输出样例:

abcd 2
abcd 2
cd 5
abcd 2
cd 4
cd 5
abcd 2
zz 4
cd 4
cd 5
abcd 2
zz 4
cd 5
点击查看代码

#include <iostream>
#include <string>
using namespace std;
struct Dog{
  string no;
  int age;
  Dog *next;    
};
Dog *head=NULL;
void *del(Dog *p){
  if(p!=NULL)    {
    del(p->next);
    delete p;
  }
}
void display(Dog *p){
    if(p!=NULL){
        cout<<p->no<<' '<<p->age<<endl;
        display(p->next);
    }
}

Dog *clear();
Dog *insert(string &no, int age);

int main()
{

    int task, age;
    string no;
    cin>>task;
    while(task>0){
        switch(task){
            case 1:cin>>no>>age; head=insert(no, age); display(head); break;
            case 2:head=clear(); display(head); break;
        }
        cin>>task;
    }
    del(head);
    return 0;    
}

/* 请在这里填写答案 */
Dog *clear()
{
    if(head==NULL)return head;
    Dog* cur=head,*q,*r;
    while(cur!=NULL){
        q=cur;
        while(q->next!=NULL){
            if(q->next->no==cur->no){
                if(cur==head){
                    head=cur->next;
                    break;
                }
                else{
                    r=head;
                    while(r->next!=cur)r=r->next;
                    r->next=cur->next;
                    break;
                    
                }
            }
            else q=q->next;
        }
        cur=cur->next;
    }
    return head;
       
}
Dog *insert(string &no, int age){
    Dog* newdog=new Dog;
    newdog->age=age;
    newdog->no=no;
    newdog->next=NULL;
    if(head==NULL)return newdog;
    Dog* dog=head,*q;
    if(head->age>=age){
        newdog->next=head;
        return newdog;
    }
    else{
        while (dog!=NULL&&dog->age<newdog->age)
        {
            q=dog;
            dog=dog->next;
        }
        newdog->next=dog;
        q->next=newdog;
        return head;       
    }
}
posted @ 2022-05-04 18:58  21CodeXin  阅读(336)  评论(0)    收藏  举报