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;
}
}

浙公网安备 33010602011771号