数据结构实验二 顺序表的应用
一、实验目的
1、掌握建立顺序表的基本方法。
2、掌握顺序表的插入、删除算法的思想和实现,并能灵活运用
二、实验内容
用顺序表实现病历信息的管理与查询功能。具体要求如下:
1.利用教材中定义顺序表类型存储病人病历信息(病历号,姓名,症状);要求使用头文件。
2.设计顺序表定位查找算法,写成一个函数,完成的功能为:在线性表L中查找数据元素x,如果存在则返回线性表中和x值相等的第1个数据元素的序号;如果不存在,则返回-1。
函数定义为 int ListFind(SequenceList L,char *x)
请在主函数中测试查找是否存在姓名为x的病人,并根据返回的序号打印出病人信息。
三、实验源代码
//SequenceList.h
typedef struct
{
ElemType list[MaxSize];
int size;
} SequenceList;
int ListFind(SequenceList *L,char *c)
{
int i;
for(i=0;i<L->size;i++)
{
if(strcmp(L->list[i].name,c)==0)
{
return i;
}
}
return -1;
}
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("参数i不合法!\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("参数i不合法");
return 0;
}
else
{
*x = L->list[i];
for (j = i+1; 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("参数i不合法!\n");
return 0;
}
else
{
*x = L.list[i];
return 1;
}
}
SequenceList.h
typedef struct
{
ElemType list[MaxSize];
int size;
} SequenceList;
int ListFind(SequenceList *L,char *c)
{
int i;
for(i=0;i<L->size;i++)
{
if(strcmp(L->list[i].name,c)==0)
{
return i;
}
}
return -1;
}
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("参数i不合法!\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("参数i不合法");
return 0;
}
else
{
*x = L->list[i];
for (j = i+1; 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("参数i不合法!\n");
return 0;
}
else
{
*x = L.list[i];
return 1;
}
}
Text2.c
#include<stdio.h>
#include<string.h>
#define MaxSize 100
#define N 2
typedef struct
{
char number[5];
char name[20];
int age;
char sex[5];
char symptom[50];
} patient;
typedef patient ElemType;
#include"SequenceList.h"
void main()
{
patient s,a;
SequenceList mylist;
int i;
ListInitialize(&mylist);;
for(i=0;i<N;i++)
{
printf("请输入第%d个病人的信息\n",i+1);
printf("请输入第%d个病人的病历号\n",i+1);
scanf("%s",s.number);
printf("请输入第%d个病人的姓名\n",i+1);
scanf("%s",s.name);
printf("请输入第%d个病人的年龄\n",i+1);
scanf("%d",&s.age);
printf("请输入第%d个病人的性别\n",i+1);
scanf("%s",s.sex);
printf("请输入第%d个病人的症状\n",i+1);
scanf("%s",s.symptom);
ListInsert(&mylist,i,s);
}
printf("请输入你要查找的病人姓名:\n");
char x[20];
int result;
scanf("%s",x);
result=ListFind(&mylist,x); //?
if(result>=0)
{
ListGet(mylist,result,&a);
printf("%s %s %d %s %s\n",a.number,a.name,a.age,a.sex,a.symptom);
}
else
{
printf("输入信息有误。");
}
}
四、实验结果
五、实验心得
1、可以用typedef来通过一种新的类型名来代替已有的基本数据类型名和已经定义了的类型;
2、可以采用头文件的方式,利用顺序表的基本操作完成程序功能;
3、头文件的包含语句必须写在MaxSize和ElemType定义之后;
4、编译源文件包含了头文件,只编译头文件是会出错的,确定头文件没有错误就可以运行。