数据结构-第二次实验

该系统使用顺序表数据结构存储患者病历信息,支持初始化、插入、删除、查找和就地逆置等操作。用户可以按顺序录入患者信息,插入新患者,删除指定患者,以及查找和打印患者信息。代码中还包含了查找特定姓名患者的函数。
摘要由CSDN通过智能技术生成

实验2 顺序表的运用

一、实验目的
1、掌握建立顺序表的基本方法。
2、掌握顺序表的插入、删除算法的思想和实现,并能灵活运用

二、实验内容
用顺序表实现病历信息的管理与查询功能。具体要求如下:
1.利用教材中定义顺序表类型存储病人病历信息(病历号,姓名,症状);要求使用头文件。
要求定义顺序表,数据元素为患者病历,数据操作包括
① 初始化顺序表② 求顺序表的长度③顺序表的插入操作 ④顺序表的删除操作 ⑤ 取数据元素 ⑥数据元素遍历打印 ⑦ 完成数据元素就地逆置操作
具体功能要求如下:
A.按顺序录入(从键盘接收输入信息)以下患者信息
病历号 姓名 症状
1000 张勇 无力、咳嗽
1005 王晓娟 脚踝疼
1008 程叙 腹部疼痛
B.在第1个位置插入一个新的患者“1001”,“陈国”, “X片阴影”;
C.删除第2个位置上的患者;
D.将顺序表中的所有元素就地逆置;
注意每步操作之后显示顺序表的内容。

2.设计顺序表定位查找算法,写成一个函数,完成的功能为:在线性表L中查找数据元素x,如果存在则返回线性表中和x值相等的第1个数据元素的序号;如果不存在,则返回-1。
函数定义为 int ListFind(SequenceList L, ElemType *x)
请在主函数中测试查找是否存在姓名为x的病人,并根据返回的序号打印出病人信息。

//patientList.h
#ifndef PATIENTLIST_H
#define PATIENTLIST_H

#include <stdio.h>
#include <string.h>

#define N 3                           //初始输入多少的病人信息 
#define Maxsize 100                   //顺序表的大小 

typedef struct {                      //建立一个结构体,包含病历号、病人姓名、病人症状 
	char Number[5];
	char Name[20];
	char symptom[50];
}patient;

typedef patient ElemType;           

typedef struct {                      //建立顺序表 
	ElemType list[Maxsize];
	int size;
}SequenceList;

SequenceList L;                          

void ListInitialize (SequenceList *L)    //顺序表的初始化 
{
	L->size = 0;
}

int ListLength(SequenceList L)           //顺序表的长度 
{
	return L.size;
}

int ListInsert(SequenceList *L,int i,ElemType x)                 //插入 
{
	int j;
	if(L->size >= Maxsize)
	{
		printf("病历表已满,无法插入!\n");
		return 0;
	}
	else if(i < 0 || i > L->size)
	{
		printf("error\n");
		return 0;
	}
	else 
	{
		for(j = L->size;j > i;j--)             //要插入时往后移动 
		{
			L->list[j] = L->list[j - 1];
		}
			L->list[i] = x;
			L->size++;
			return 1;

	}
} 

int ListDelete(SequenceList *L,int i,ElemType *x)             //删除 
{
	int j;
	if(L->size <= 0)
	{
		printf("病历表已空,无患者信息可删除!\n");
		return 0;
	} 
	else if(i < 0 || i > L->size - 1)
	{
		printf("error");
		return 0;
	}
	else
	{
		*x = L->list[i];                          //要删除时往前移动 
		for(j = i;j <= L->size - 1;j++)
		{
			L->list[j - 1] = L->list[j];
			L->size--;
			return 1;
		}
	}
}

int ListGet(SequenceList L,int i,ElemType *x)                //获得顺序表的对应的值 
{
	if(i < 0 || i > L.size-1)
	{
		printf("error");
		return 0; 
	}
	else
	{
		*x = L.list[i];                                    //将值赋值到一个新的结构体里 
		return 1;
	}
} 

void Converse(SequenceList *L)                             //将顺序表就地逆置 
{
	int i;
    ElemType temp;
		for( i= 0;i < L->size/2; i++)                    //不用判断奇数偶数,/2可以直接进行下一步 
		{
			temp = L->list[i];                            //交换姓名、病历号、症状 
			L->list[i] = L->list[L->size - i - 1];
			L->list[L->size - i - 1] = temp;
		}	
} 


int ListFind(SequenceList L, ElemType *x)                   //查找 
{
	int i = 0;
    while(strcmp(L.list[i].Name,x->Name)!= 0 && strcmp(L.list[i].Number,x->Number)!= 0 \
	       && strcmp(L.list[i].symptom,x->symptom)!=0 )   //这个是判断输入的姓名是否与原来顺序表中的一致 
    {   
				i++;
	}

      			if(i > L.size)               //不一致 
   			{
   				return -1;
			}
			else                            //一致 
			{
		    	return i;	                //返回顺序表中相应的序号 
			}
}

#endif
#include "patientList.h" 
#include "stdio.h"

void main()
{
	patient s;
	SequenceList mylist;
	int i;
	int num;
	int n;
	ElemType name;
/*******************************初始化**************************************/		
	ListInitialize (&mylist);                  //顺序表初始化
	if(ListLength(mylist) == 0)
	{
		printf("顺序表初始化成功!\n");
		printf("该病例有%d个病人的信息\n",ListLength(mylist));
	 
	 for(i = 0;i < ListLength(mylist);i++)
	 {
	 	ListGet(mylist,i,&s);
	 	printf("%s,%s,%s\n",s.Number,s.Name,s.symptom);
	 }
	 printf("\n"); 	
	}

/*******************************输入**************************************/		
	for(i = 0;i < N;i++)                      //输入数据 
	{
		printf("---请输入第%d个病人的信息---\n",i+1);
		printf("请输入第%d个病人的病历号:",i+1);
		scanf("%s",s.Number); 
	 	printf("请输入第%d个病人的姓名:",i+1);
		scanf("%s",s.Name); 
		printf("请输入第%d个病人的症状:",i+1);
		scanf("%s",s.symptom); 
		ListInsert(&mylist,i,s);    //插入到顺序表中 
	 } 
	 
	 printf("\n"); 
	 printf("该病例有%d个病人的信息\n",ListLength(mylist));
	 
	 for(i = 0;i < ListLength(mylist);i++)
	 {
	 	ListGet(mylist,i,&s);
	 	printf("%s,%s,%s\n",s.Number,s.Name,s.symptom);
	 }
	 printf("\n"); 
/*******************************插入**************************************/	
	printf("---插入新的患者的信息---\n");     
     printf("---请输入新患者的信息---\n");
     printf("该病人的病历号:"); 
	 scanf("%s",s.Number);
	 printf("该病人的名字:"); 
     scanf("%s",s.Name);
     printf("该病人的症状:");
     scanf("%s",s.symptom);
     ListInsert(&mylist,1,s);    //插入到顺序表中 
     
     printf("\n"); 
    printf("该病例有%d个病人的信息\n",ListLength(mylist));
	 
	 for(i = 0;i < ListLength(mylist);i++)
	 {
	 	ListGet(mylist,i,&s);
	 	printf("%s,%s,%s\n",s.Number,s.Name,s.symptom);
	 	
	 }
	 
	printf("\n"); 
/*******************************删除**************************************/		 
	printf("---删除患者信息---\n");
	 ListDelete(&mylist,3,&s);
	 
	printf("该病例有%d个病人的信息\n",ListLength(mylist));
	 
	 for(i = 0;i < ListLength(mylist);i++)
	 {
	 	ListGet(mylist,i,&s);
	 	printf("%s,%s,%s\n",s.Number,s.Name,s.symptom);
	 	
	 }
	 
	printf("\n"); 
/*******************************逆置**************************************/	
	printf("---将患者信息进行逆置操作---\n");	 
	 Converse(&mylist);
	 printf("该病例有%d个病人的信息\n",ListLength(mylist));
 
	 for(i = 0;i < ListLength(mylist);i++)
	 {
	 	ListGet(mylist,i,&s);
	 	printf("%s,%s,%s\n",s.Number,s.Name,s.symptom);
	 	
	 }
	 printf("\n"); 
/*******************************查找**************************************/	
	 printf("\n"); 
	 printf("请输入需要查找的病人名字:\n"); 
	 scanf("%s",name.Name);
	 	if(ListGet(mylist,ListFind(mylist,&name),&s))
	 	{
		 printf("%s,%s,%s\n",s.Number,s.Name,s.symptom);
		}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

特辣番茄炒鸡蛋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值