实验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);
}
}