实验1线性表的实现与应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
21
case 4: { printf("\ 请输入要删除人员的学号: printf("\n请输入要删除人员的学号:"); scanf("%ld", &(temp.xh)); weizhi=ListLocate(txl,temp); if(weizhi<=0) printf("\ 学号有误,没有你要找的信息!"); printf("\n学号有误,没有你要找的信息!"); else { ListDelete(&txl,weizhi); printf("\ 删除成功! printf("\n删除成功!"); } break; } case 5:
19
case 2: { printf("\ 请输入要查找的学号: printf("\n请输入要查找的学号:"); scanf("%ld", &(temp2.xh)); weizhi=ListLocate(txl,temp2); if(weizhi<=0) printf("\ 学号有误,没有你要找的信息!"); printf("\n学号有误,没有你要找的信息!"); else { ListGet(txl,weizhi,&temp); printf("\ 以下是找到的信息: printf("\n以下是找到的信息:"); printf("\ 学号\ 姓名\ 寝室\ 电话\ printf("\n学号\t姓名\t寝室\t电话\tQQ"); printf("\n%ld\t%s\t%s\t%ld\ printf("\n%ld\t%s\t%s\t%ld\t%ld",temp.xh, temp. xm,temp.qs,temp.dh,temp.qq); } break; } case 3:
9
4.定位(查找) 4.定位(查找)程序 定位
int ListLocate(SEQLIST L, DATATYPE x) //返回线性表L中第一个值为x的位置 返回线性表L 返回线性表 中第一个值为x //返回值>0表示找到的结点位置,返回0表示无此结 返回值>0表示找到的结点位置, 返回值>0表示找到的结点位置 返回0 点 { int i; for (i=0;i<L.len;i++) if (L.data[i]==x) return (i+1); return(0); }
printf("\ 请选择: printf("\n请选择:"); scanf("%d",&xuanze); switch(xuanze) { case 1: { ListInit(&txl); printf("\ 通讯录已经清空! printf("\n通讯录已经清空!"); break; } case 2:
17
主界面函数
void zhujiemian() { int xuanze, weizhi,i; DATATYPE temp,temp2; SEQLIST txl; ListInit(&txl); while(1) { printf("\ printf("\n********************************************"); printf("\n********班级通讯录管理系统 printf("\n********班级通讯录管理系统*************"); 班级通讯录管理系统*************"); printf(“\n****1、 printf(“\n****1、清空通讯录 2、查找信息***"); 查找信息***"); printf("\n****3、 printf("\n****3、新增信息 4、删除信息***"); 删除信息***"); printf(“\n****5、 printf(“\n****5、输出所有信息 0、退 出*****"); *****"); printf("\ printf("\n********************************************"); printf("\ 请选择: printf("\n请选择:"); scanf("%d",&xuanze); 18
13
//为空 //为空
1.1.2.3顺序线性表的简单应用 1.1.2.3顺序线性表的简单应用
班级通讯录管理系统的主要部分: 班级通讯录管理系统的主要部分: 1、主界面 2、清空通讯录 3、查找信息 4、新增信息 5、删除信息 6、输出所有信息
14
功能结Fra Baidu bibliotek图
通讯录主界面 输 出 所 有 信 息
15
10
5. 插 入 程 序
int ListInsert(SEQLIST *L, int i, DATATYPE x) 成功: 失败: //在顺序表L的第i个位置插入元素x,成功:1,失败:0 { int j; if ((L->len)>=maxsize) { printf("overflow\n"); return 0;} //溢出 else if((i<1)||(i>L->len+1)) { printf("error\n"); return 0;} //非法位置 else { for(j=L->len-1;j>=i-1;j--) L->data[j+1]=L->data[j]; //结点后移 L->data[i-1]=x; //插入x L->len=L->len+1; //表长加1 return(1); //成功 } } 11
5
/*线性表中实际存放的数据个数 /*线性表中实际存放的数据个数*/ 线性表中实际存放的数据个数*
1.1.2.2顺序线性表基本操作 1.1.2.2顺序线性表基本操作
1.置空表 初始化) 1.置空表(初始化) void ListInit (SEQLIST *L) 置空表( 2.求长度 2.求长度 int ListLength(SEQLIST L) 3.取结点 3.取结点 int ListGet(SEQLIST L, int i ,DATATYPE *elem) 4.定位 查找) 定位( 4.定位(查找) int ListLocate(SEQLIST L, DATATYPE x) 5.插入 5.插入 int ListInsert(SEQLIST *L, int i, DATATYPE x) 6.删除 6.删除 int ListDelete(SEQLIST *L,int i) 7.判断是否为空表 7.判断是否为空表 int ListIsEmpty(SEQLIST L) 6
• 1.1.2.1 顺序线性表的定义 • 1.1.2.2 顺序线性表基本操作 • 1.1.2.3 顺序线性表简单应用
4
1.1.2.1顺序线性表类型的定义 1.1.2.1顺序线性表类型的定义
typedef int DATATYPE; //顺序表元素的数据类型 //顺序表元素的数据类型 #define maxsize 64 //顺序表可能达到的容量 //顺序表可能达到的容量 typedef struct { DATATYPE data[maxsize]; /*顺序表元素数组,第一个结点是data[0] */ /*顺序表元素数组,第一个结点是data[0] 顺序表元素数组 int len; } SEQLIST;
通过上机,让学生掌握线性表的顺序存储的实 通过上机, 掌握顺序表类型的定义,顺序表变量的使用, 现。掌握顺序表类型的定义,顺序表变量的使用, 以及顺序表的7个基本操作函数。并能利用7 以及顺序表的7个基本操作函数。并能利用7个基 本操作实现其他功能。 本操作实现其他功能。
3
1.1.2、 1.1.2、实验的原理及内容
16
}DATATYPE; /*定义信息的数据项*/ /*定义信息的数据项 定义信息的数据项*
修改后的查找函数
int ListLocate(SEQLIST L, DATATYPE x) //返回线性表L中第一个学号为x的位置 //返回线性表 中第一个学号 返回线性表L 学号为 //返回值>0表示找到的结点位置,返回0表示无此结 //返回值 表示找到的结点位置 返回0 返回值>0表示找到的结点位置, 点 { int i; for (i=0;i<L.len;i++) if (L.data[i].xh==x.xh) (L.data[i].xh==x.xh) return (i+1); return(0); }
1.置空表(初始化) 1.置空表(初始化) 置空表
void ListInit (SEQLIST *L) //将表L清空(初始化) 将表L清空(初始化) { L->len=0; }
7
2.求长度 2.求长度
int ListLength(SEQLIST L) //返回线性表L //返回线性表L的元素个数 返回线性表 { return(L.len); }
8
3.取结点程序 3.取结点程序
int ListGet(SEQLIST L, int i ,DATATYPE *elem) //将线性表L的第i个位置的元素值保存到elem所指 将线性表L elem所指 将线性表 的第i个位置的元素值保存到elem 的地址,成功返回1 失败返回0 的地址,成功返回1,失败返回0。 { if ((i<1)||(i>L.len)) { printf("No Such Node\n"); return 0; } else { *elem=L.data[i-1]; return 1;} }
清 空 通 讯 录
查 找 信 息
新 增 信 息
删 除 信 息
数据类型的修改
typedef struct { long xh; char xm[10]; char qs[10]; long dh; long qq; /*学号*/ /*学号 学号* /*姓名*/ /*姓名 姓名* /*寝室*/ /*寝室 寝室* /*电话*/ /*电话 电话* /*QQ号 /*QQ号*/
20
case 3: { printf("\ 请输入新增人员的学号: printf("\n请输入新增人员的学号:"); scanf("%ld",&(temp.xh)); printf("请输入新增人员的姓名 printf("请输入新增人员的姓名:"); 请输入新增人员的姓名: scanf("%s",&(temp.xm)); printf("请输入新增人员的寝室 printf("请输入新增人员的寝室:"); 请输入新增人员的寝室: scanf("%s",&(temp.qs)); printf("请输入新增人员的电话 printf("请输入新增人员的电话:"); 请输入新增人员的电话: scanf("%ld",&(temp.dh)); printf("请输入新增人员的 Q: printf("请输入新增人员的Q Q:"); 请输入新增人员的Q scanf("%ld",&(temp.qq)); if(ListInsert(&txl,ListLength(txl)+1,temp)==1) printf("\ 新增成功! printf("\n新增成功!"); else printf("\n新增失败!"); printf("\ 新增失败! break; } case 4:
实验1 实验1 线性表的实现与应用
实验1.1: 实验1.1: 线性表的顺序实现 实验1.2: 实验1.2:线性表的链式实现 实验1.3: 实验1.3:线性表的应用
1
实验1.1: 实验1.1: 线性表的顺序实现
1.1.1 实验目的及要求 1.1.2 实验的原理及内容 1.1.3 实验的结果及测试
2
1.1.1、 1.1.1、实验目的及要求
7.判断是否为空表 7.判断是否为空表
int ListIsEmpty(SEQLIST L) //判断表L是否为空,为空返回1,非空返回0 //判断表 是否为空,为空返回1 非空返回0 判断表L { if(L.len>=1) return 0; //非空 0;//非空 else return 1; }
6.删除程序 6.删除程序
int ListDelete(SEQLIST *L,int i) //删除第 个位置上的结点,成功返回1,失败返回0 删除第i个位置上的结点,成功返回 ,失败返回 删除第 个位置上的结点 { int j; if ((i<1)||(i>L->len)) { printf("error\n"); return 0;} //非法位置 非法位置 else { for(j=i;j<L->len;j++) //第i个结点的下标是 个结点的下标是i-1 第 个结点的下标是 L->data[j-1]=L->data[j]; //结点前移 结点前移 L->len--; //表长减 表长减1 表长减 return(1); } } 12