数据结构实验1

 函数题

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;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yhan计算机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值