函数题
6-1 密接者追踪系统(单链表的插入和查询)
新冠疫情泛滥,为了控制疫情传播速度,对密接者的追踪和管理非常重要。现在开发一款密接者追踪系统,存放所有密接者信息,该系统能够按照姓名查询密接者信息,也能在系统中插入新的密接者。已知该系统采用单链表实现密接者信息的存储(已存有4位密接者的信息,包括姓名和症状),编写函数实现密接者的查询和新增。
函数接口定义:
在这里描述函数接口。 例如: LinkList locate_LinkList(LinkList H, char key[]); //H为单链表的头指针,key为要查询的姓名 Status ListInsert(LinkList &H,int i,ElemType e);//H为单链表的头指针,i为插入位置,e为新增的密接者
裁判测试程序样例:
#include<string.h> #include<stdio.h> #include<malloc.h> #define MAXSIZE 30 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef int Status; typedef struct { char name[20]; char symptom[20]; }ElemType; typedef struct LNode /* 定义链式存储结构 */ { ElemType data; struct LNode *next; }LNode,*LinkList; Status Creat_LinkList(LinkList &head) /* 创建链表,预存4个密接者信息 */ { LinkList r,s; head=(LinkList)malloc(sizeof(LNode)); head->next=NULL; r=head; s=(LNode *)malloc(sizeof(LNode)); strcpy(s->data.name,"陈晨"); strcpy(s->data.symptom,"无症状"); r->next=s; r=s; s=(LNode *)malloc(sizeof(LNode)); strcpy(s->data.name,"李俐"); strcpy(s->data.symptom,"轻微咳嗽"); r->next=s; r=s; s=(LNode *)malloc(sizeof(LNode)); strcpy(s->data.name,"李林"); strcpy(s->data.symptom,"无症状"); r->next=s; r=s; s=(LNode *)malloc(sizeof(LNode)); strcpy(s->data.name,"张伟"); strcpy(s->data.symptom,"乏力"); r->next=s; r=s; r->next=NULL; return OK; }/* Creat_LinkList */ void Print_LinkList( LinkList H) /* 输出链式表 */ { LinkList p; p=H->next; while(p!=NULL) { printf("接触者:%s,症状为:%s\n",p->data.name,p->data.symptom); p=p->next; } }/* Print_LinkList */ LinkList locate_LinkList(LinkList H, char key[]) { /* 请在这里填写答案 */ }/*Get_LinkList*/ Status ListInsert(LinkList &H,int i,ElemType e) { /* 请在这里填写答案 */ } int main() { char kname[20]; ElemType person; int location; LinkList L,loc; Creat_LinkList(L); //创建单链表 scanf("%s",person.name); //输入新增密接者的新名 scanf("%s",person.symptom);//输入新增密接者的症状 scanf("%d",&location);//输入插入位置 ListInsert(L,location,person);//执行插入 Print_LinkList(L);//打印插入后的密接者名单 scanf("%s",kname);//输入待查询的密接者的姓名 loc=locate_LinkList(L,kname);//按姓名查询密接者 if(loc!=NULL) //查找成功则打印该密接者的症状 printf("接触者%s的症状为:%s\n",loc->data.name,loc->data.symptom); else printf("查无此人!"); return OK; }
输入样例:
张三 咳嗽 2 李林
输出样例:
接触者:陈晨,症状为:无症状 接触者:张三,症状为:咳嗽 接触者:李俐,症状为:轻微咳嗽 接触者:李林,症状为:无症状 接触者:张伟,症状为:乏力 接触者李林的症状为:无症状
参考答案:
LinkList locate_LinkList(LinkList H,char key[]) { LinkList p=H; while(p->next!=NULL) { if(strcmp(p->data.name,key)==0) return p; else p=p->next; } return 0; }/*Get_LinkList*/ Status ListInsert(LinkList &H,int i,ElemType e) { LinkList p,q; p=(LNode *)malloc(sizeof(LNode)); q=(LNode *)malloc(sizeof(LNode)); p=H; int n=0; if(i == 1) { strcpy(q->data.name,e.name); strcpy(q->data.symptom,e.symptom); q->next=p->next; p->next=q; return OK; } else { while(p->next!=NULL) { n++; if(n==i) { strcpy(q->data.name,e.name); strcpy(q->data.symptom,e.symptom); q->next=p->next; p->next=q; return OK; } else p=p->next; } if(p->next==NULL) return ERROR; } }
6-2 有序链表合并
请编程实现有序链表合并。
函数接口定义:
LinkList Read( ); //按顺序依次读入元素,生成一个带头结点的单链表,表中元素值排列顺序与输入顺序一致,若输入-1,则创建链表结束(链表中不包含-1)。此处要求元素值按非递减顺序录入 LinkList Merge( LinkList L1, LinkList L2 ); //合并L1与L2。已知L1与L2中的元素非递减排列,要求合并后的单链表中元素也按值非递减排列。
参数 L1 和 L2 是两个有序链表(均按照非递减排列),均为带头结点的单链表。
裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; LinkList Read( ); LinkList Merge( LinkList L1, LinkList L2 ); int main() { LinkList L1, L2, L,p; L1 = Read(); L2 = Read(); L = Merge(L1, L2); if(!L) { printf("empty"); return 0; } p=L->next; while(p!=NULL){ printf("%d ",p->data); p=p->next; } return 0; } /* 请在这里填写答案 */
输入样例:
1 3 5 8 -1 2 6 8 -1
输出样例:
1 2 3 5 6 8 8
参考答案:
LinkList Read() { LNode *L=(LNode *)malloc(sizeof(LNode)); LNode *p=(LNode *)malloc(sizeof(LNode)); int n; scanf("%d",&n); if(n==-1) { L->next=NULL; return L; } else { L=p; while(n!=-1) { LNode *s=(LNode *)malloc(sizeof(LNode)); s->data=n; s->next=NULL; p->next=s->next; p->next=s; p=s; scanf("%d",&n); } } /* LNode *temp=(LNode *)malloc(sizeof(LNode)); temp=L->next; while(temp!=NULL) { printf("%d ",temp->data); temp=temp->next; } */ return L; } LinkList Merge( LinkList L1, LinkList L2 ) { LNode *L,*p,*q,*a,*s; L=(LNode *)malloc(sizeof(LNode)); p=(LNode *)malloc(sizeof(LNode)); q=(LNode *)malloc(sizeof(LNode)); a=(LNode *)malloc(sizeof(LNode)); p=L1; q=L2; L=a; if(p->next==NULL and q->next==NULL) return NULL; else if(p->next==NULL and q->next!=NULL) return q; else if(p->next!=NULL and q->next==NULL) return p; else { p=p->next; q=q->next; while(p!=NULL and q!=NULL) { if(p->data<q->data) { s=(LNode *)malloc(sizeof(LNode)); s->data=p->data; s->next=NULL; a->next=s->next; a->next=s; a=s; p=p->next; } else if(p->data>q->data) { s=(LNode *)malloc(sizeof(LNode)); s->data=q->data; s->next=NULL; a->next=s->next; a->next=s; a=s; q=q->next; } else { s=(LNode *)malloc(sizeof(LNode)); s->data=p->data; s->next=NULL; a->next=s->next; a->next=s; a=s; p=p->next; s=(LNode *)malloc(sizeof(LNode)); s->data=q->data; s->next=NULL; a->next=s->next; a->next=s; a=s; q=q->next; } } if(p==NULL and q==NULL) return L; else if(p==NULL) { while(q!=NULL) { s=(LNode *)malloc(sizeof(LNode)); s->data=q->data; s->next=NULL; a->next=s->next; a->next=s; a=s; q=q->next; } return L; } else if(q==NULL) { while(p!=NULL) { s=(LNode *)malloc(sizeof(LNode)); s->data=q->data; s->next=NULL; a->next=s->next; a->next=s; a=s; q=q->next; } return L; } } return 0; }
6-3 统计计算机专业学生人数
本题要求实现一个函数,统计计算机专业的学生人数。学生学号存储在单链表中,通过识别学号来判断该学生是否为计算机专业的学生,学生的学号共7位数字,其中第2、3位是专业编号,计算机专业的编号为02。例如,‘8026823’则为计算机专业学生,‘8062391’为非计算机专业学生。
链表结点定义如下:struct ListNode { char code[8]; struct ListNode *next; };
函数接口定义:
int countcs( struct ListNode *head );
其中
head
是用户传入的学生学号链表的头指针;函数countcs统计并返回head链表中专业为计算机的学生人数。裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ListNode { char code[8]; struct ListNode *next; }ListNode,*Linklist; Linklist createlist() { Linklist head, p, q; char s[8]; scanf("%s",s); head = (Linklist)malloc(sizeof(ListNode )); p = head; while(s[0]!='#') { q = (Linklist)malloc(sizeof(ListNode )); strcpy(q->code,s); p->next = q; p = q; scanf("%s",s); } p->next = NULL; return head; }; /* 你的代码将被嵌在这里 */ int countcs( Linklist head ); int main() { Linklist L; L=createlist(); printf("%d",countcs(L)); } /* 请在这里填写答案 */
参考答案:
int countcs( struct ListNode *head ) { int count=0; head=head->next; while(head!=NULL) { if(head->code[1]=='0' and head->code[2]=='2') count++; head=head->next; } return count; }
编程题
7-1 顺序表求交集
两个线性表La和Lb均采用顺序存储结构,数据元素均为正整数,两个线性表中各有若干个整数,编写程序求出两个线性表的交集。
已知顺序表的结构定义如下:typedef struct { ElemType *elem; //存储空间基址,体现动态性 int length; //当前表的长度 int listsize; //当前分配的存储容量 }SqList;
主程序框架为:
int main() { SqList La,Lb,Lc; InitList_Sq(La); //初始化3个线性表 InitList_Sq(Lb); InitList_Sq(Lc); Listinput(La); //输入La的值 Listinput(Lb);//输入Lb的值 steMUl(Lc,La,Lb);//求出La和Lb的交集,放在Lc中 print_List(Lc);//打印交集 return 0; }
输入格式:
输入两行正整数,每行均以0结束(0之前的整数为线性表中数据元素,不包括0)。
输出格式:
输出两个线性表中交集,每个整数之间以一个空格隔开;如果两个线性表没有交集则输出“empty class”。
输入样例:
1 5 9 11 15 0 2 4 5 6 9 10 0
输出样例:
5 9
参考答案:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef int ElemType; typedef struct SqList { ElemType *elem; //存储空间基址,体现动态性 int length;//当前表的长度 int listsize;//当前分配的存储容量 }SqList; int InitList_Sq(SqList &s)//初始化 { s.listsize=50; s.elem=(ElemType *)malloc(s.listsize*sizeof(ElemType)); s.length=0; return 1; } int Listinput(SqList &s)//输入值 { int i; scanf("%d",&i); while(i!=0) { s.elem[s.length]=i; scanf("%d",&i); s.length++; } return 1; } int steMUl(SqList &c,SqList &a,SqList &b)//求交集 { for(int i=0;i<a.length;i++) { for(int j=0;j<b.length;j++) { if(a.elem[i]==b.elem[j]) { c.elem[c.length]=a.elem[i]; c.length++; break; } } } return 1; } void print_List(SqList s)//打印 { if(s.length==0) printf("empty class"); else for(int i=0;i<s.length;i++) printf("%d ",s.elem[i]); } int main() { SqList La,Lb,Lc; InitList_Sq(La); //初始化3个线性表 InitList_Sq(Lb); InitList_Sq(Lc); Listinput(La); //输入La的值 Listinput(Lb);//输入Lb的值 steMUl(Lc,La,Lb);//求出La和Lb的交集,放在Lc中 //print_List(La); //print_List(Lb); print_List(Lc);//打印交集 return 0; }