1.06k likes | 1.25k Views
项目 9 学生记录操作. 项目 9 学生记录操作. 【 学习目标 】. (1) 熟悉链表的结构和用途。 (2) 掌握链表的创建和查找的方法。 (3) 熟练使用链表进行插入、删除操作。. 任务 9.1 对顺序存储的学生记录进行查找. 任务介绍. 对于学生信息记录,要求能够根据需要进行查找,现要求用顺序表实现对学生记录的查询操作,要求输入学生的学号,系统就能够显示该学号对应学生的详细信息。 顺序表的具体结构见表 9-1 。. 表 9-1 记录表. 任务 9.1 对顺序存储的学生记录进行查找. 任务介绍. 数据输入输出格式如下:.
E N D
项目9 学生记录操作 【学习目标】 • (1) 熟悉链表的结构和用途。 • (2) 掌握链表的创建和查找的方法。 • (3) 熟练使用链表进行插入、删除操作。
任务9.1 对顺序存储的学生记录进行查找 任务介绍 对于学生信息记录,要求能够根据需要进行查找,现要求用顺序表实现对学生记录的查询操作,要求输入学生的学号,系统就能够显示该学号对应学生的详细信息。 顺序表的具体结构见表9-1。 表9-1 记录表
任务9.1 对顺序存储的学生记录进行查找 任务介绍 数据输入输出格式如下: 当前学生记录信息如下: 学号 性别姓名成绩 090101 女李燕98 090102 男李阳98 090103 女王娜78 请输入你要查找的学号:090102 查找的结果如下: 学号 性别姓名成绩 090102 男李阳98
任务9.1 对顺序存储的学生记录进行查找 解决思路 方法: S1:确定顺序表结构。 S2:初始化顺序表。 S3:输入学生记录,创建顺序表的节点信息。 S4:按照给定的学号进行顺序查找,如果找到,则输出查询结果信息;如果未找到,则输出查找失败信息。
任务9.1 对顺序存储的学生记录进行查找 解决思路 主函数框架如下: main() { printf("当前记录如下:\n"); 调用顺序表查找函数Locate; 输出查询结果; }
任务9.1 对顺序存储的学生记录进行查找 解决思路 各个子函数框架如下: int Locates(struct node L[],int n,char e[20]) /*在顺序表中查找值为e的节点*/ { int i; while (L[i].num!=e;) i++; if (i<n) return i; else return -1;
任务9.1 对顺序存储的学生记录进行查找 解决思路 各个子函数框架如下: } void Travser (struct node L[],int n) /*遍历顺序表,打印记录信息*/ { int i; printf("当前学生记录如下:\n"); printf("学号\t性别\t姓名\t成绩\n"); for(i=0;i<n;i++) printf("%-8s%-8s%-8s%-td\n",L->data[i].num,L->data[i].sex, L->data[i].name,L->data[i].score); }
任务9.1 对顺序存储的学生记录进行查找 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: #include<string.h> #include<stdlib.h> #include<stdio.h> struct node /*定义节点结构*/ { char num[20]; /*定义学号*/ char sex[5]; /*定义性别*/ char name[20];
任务9.1 对顺序存储的学生记录进行查找 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: /*定义姓名*/ int score; /*定义成绩*/ }; int Locates(struct node L[],int n,char e[20]); /*函数声明*/ void Travser (struct node L[],int n); int main() { char temp[20]; /*定义结构体数组*/ int flag;
任务9.1 对顺序存储的学生记录进行查找 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: struct node data[]={{"090101","女","李燕",98},{"090102","男","李阳",98}, {"090103","女","王娜",78}}; Travser(data,3); printf("请输入你要查找的学号:"); scanf("%s",temp); flag= Locates(data,3,temp); if(flag>0) { printf("记录查找成功!"); printf("查找的结果如下:\n"); printf("学号\t性别\t姓名\t成绩\n");
任务9.1 对顺序存储的学生记录进行查找 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: printf("%-8s%-8s%-8s%-8d\n",data[flag].num, data[flag].sex,data[flag].name,data[flag].score); } else printf("查找记录失败!你查找的记录不存在!"); } int Locates(struct node L[],int n,char e[20]) /*在顺序表中查找值为e的节点*/ { int i=0; while (strcmp(L[i].num,e)!=0) i++;
任务9.1 对顺序存储的学生记录进行查找 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: if (i<n) return i; else return -1; } void Travser (struct node L[],int n) /*遍历顺序表,打印记录信息*/ { int i; printf("当前学生记录如下:\n"); printf("学号\t性别\t姓名\t成绩\n");
任务9.1 对顺序存储的学生记录进行查找 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: for(i=0;i<n;i++) printf("%-8s%-8s%-8s%-8d\n",L[i].num,L[i].sex,L[i].name,L[i].score); }
任务9.1 对顺序存储的学生记录进行查找 任务实现 【运行结果】 由上面的代码可以看出,要实现这个任务,需要掌握如下知识点: (1) 顺序表的链式存储结构。 (2) 顺序表的初始化与创建。 (3) 顺序表的查找算法。
(1) 顺序表所占的存储空间是连续的。 (2) 顺序表中各数据元素是按逻辑顺序依次存放的。 任务9.1 对顺序存储的学生记录进行查找 9.1.1 顺序表 顺序表具有以下两个基本特点:
任务9.1 对顺序存储的学生记录进行查找 9.1.1 顺序表 图9-1 顺序表存储结构
任务9.1 对顺序存储的学生记录进行查找 9.1.1 顺序表 图9-2 顺序表结构
任务9.1 对顺序存储的学生记录进行查找 9.1.1 顺序表 在C语言中,可用下述类型定义来描述顺序表: #define MaxLen 100 /*顺序表的容量*/ typedef int ElemType /*在实际应用中,将ElemType定义成实际类型*/ typedef struct { ElemType data[MaxLen]; /*定义存储表中元素的数组*/ int length; /*顺序表的实际长度*/ }List; List L; /*定义表结构的变量*/
任务9.1 对顺序存储的学生记录进行查找 9.1.2 查找运算locate(L,x)的实现 查找操作的具体实现算法如下: int Locate(List *L,ElemType x) { int i; i=0; while(i<L->length && L->data[i]!=x) i++; if(i<L->length) return i; else return 0; }
任务9.1 对顺序存储的学生记录进行查找 9.1.2 查找运算locate(L,x)的实现 【例9-1】利用上述的查找运算Locate(L,x)实现在线性表中查找元素。 具体程序代码如下: #include <stdio.h> #define MaxLen 100 /*线性表的容量*/ typedef int ElemType; /*在实际应用中,将ElemType定义成实际类型*/ typedef struct { ElemType data[MaxLen]; /*定义存储表中元素的数组*/ int length; /*线性表的实际长度*/
任务9.1 对顺序存储的学生记录进行查找 9.1.2 查找运算locate(L,x)的实现 }List; List L; /*定义表结构的变量*/ int Locate(List *L,int x) { int i; i=0; while(i<L->length && L->data[i]!=x) i++; if(i<L->length) return i; else return 0; }
任务9.1 对顺序存储的学生记录进行查找 9.1.2 查找运算locate(L,x)的实现 void main() { List L; int i,j,num,temp; for(i=0;i<=100;i++) L.data[i]=i; L.length=100; printf("当前顺序表中的元素分别为:"); for(j=0;j<=L.length;j++) printf("%d ",L.data[j]); printf("\n"); printf("请输入你要查找的数据(1~100):"); scanf("%d",&num);
任务9.1 对顺序存储的学生记录进行查找 9.1.2 查找运算locate(L,x)的实现 temp=Locate(&L,num); printf("你要查找的元素位置为:"); printf("%d",temp); printf("\n"); }
任务9.1 对顺序存储的学生记录进行查找 9.1.2 查找运算locate(L,x)的实现 【运行结果】 【运行结果分析】 在上述例子中,首先为顺序表中元素赋值,然后调用了顺序表中查找某元素位置的运算Locate(L,x)实现对输入元素位置的查找。
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 对于学生信息记录,要求能够根据需要进行查找,如果所查找的学生记录不存在并能够动态地增加学生记录,现要求用线性表实现对学生记录的插入和删除操作。 线性表的具体结构见表9-2。 表9-2 线性表结构
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 数据输入输出格式如下: 当前学生记录如下: 学号性别姓名成绩 090101 女李燕88 090102 男李阳98 090103 女王娜78 请输入插入点位置:090102 请输入要插入的记录数据:090104 男王强90 插入记录成功!
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 数据输入输出格式如下: 当前学生记录如下: 090101 女李燕88 090104 男王强90 090102 男李阳98 090103 女王娜78 请输入要删除点位置:090104 当前学生记录如下: 090101 女李燕88 090102 男李阳98 090103 女王娜78
任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 方法: S1:确定顺序表结构。 S2:创建顺序表。 S3:按照给定的学号进行节点插入,如果插入成功,输出提示信息,并输出插入节点后学生记录。 S4:按照给定的学号进行节点删除,如果删除成功,输出提示信息,并输出插入节点后学生记录。
任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 主函数框架如下: main() { //初始化学生记录数据; //调用遍历函数,输出当前记录数据; //调用插入新记录函数Insert; //调用遍历函数,输出当前记录数据; //调用记录删除函数; //调用遍历函数,输出当前记录数据; }
任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 各个子函数框架如下: void Travser (struct node L[],int n) /*遍历顺序表,打印记录信息*/ { int i; printf("当前学生记录如下:\n"); printf("学号\t性别\t姓名\t成绩\n"); for(i=0;i<n;i++) printf("%-8s%-8s%-8s%-8d\n",L.data[i].num, L.data[i].sex,L.data[i].name,L.data[i].score); } int Insert(struct node array[],struct node *node,char numm[20])
任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 各个子函数框架如下: /*插入函数*/ { int i=0; int j; while(strcmp(array[i].num,numm)!=0) i++; if(i>2) { printf("插入位置非法!"); return 0; } else
任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 各个子函数框架如下: { for(j=2;j>=i;j--) array[j+1]=array[j]; strcpy(array[i].num,node.num); strcpy(array[i].name,node.name); strcpy(array[i].sex,node.sex); array[i].score=node.score; return 1; }/*else结束*/ } int deletelist(struct node array[],char numm[20]) {
任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 各个子函数框架如下: int i; while(strcmp(array[i].num,numm)!=0) i++; if(i>3) { printf("插入位置非法!"); return 0;
任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 各个子函数框架如下: } else { for(j=i;j<=4;j++) array[j]=array[j+1]; return 1; }/*else结束*/ }
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: #define MaxLen 100 #include<string.h> #include<stdlib.h> #include<stdio.h> struct node /*定义节点结构*/ { char num[20]; /*定义学号*/ char sex[5]; /*定义性别*/ char name[20]; /*定义姓名*/ int score; /*定义成绩*/ }; void Travser(struct node L[],int n);
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: int Insert(struct node array[],struct node *node,char numm[20]); int deletelist(struct node array[],char numm[20]); int main() { char temp1[20]; /*定义结构体数组*/ struct node temp2; /*定义临时变量*/ int flag; struct node data[MaxLen]={{"090101","女","李燕",88},{"090102","男", "李阳",98},{"090103","女","王娜",78}};
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: Travser(data,3); /*调用顺序表遍历函数,输出当前顺序表中的记录数据*/ printf("请输入插入点位置:"); /*输入插入点的位置,这里输入的是学号,插入到输入学号之前*/ scanf("%s",temp1); printf("请输入要插入的记录数据:"); scanf("%s%s%s%d",temp2.num,temp2.sex,temp2.name,&temp2.score); /*输入插入的学生记录数据*/ flag=Insert(data,&temp2,temp1);
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: /*调用顺序表插入函数,并把返回结果存放到标记变量flag中*/ if (flag) /*判断是否插入成功,如果flag为1,插入成功,为0,插入失败*/ { printf("插入记录成功!\n"); Travser (data,4); } else printf("插入记录失败!\n"); printf("请输入删除点的位置:"); /*输入删除记录的学号*/ scanf("%s",temp1);
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: flag=deletelist(data,temp1); /*调用顺序表删除函数,并把返回值存放到标记变量flag中*/ if (flag) /*判断是否删除成功,如果flag为1,删除成功,为0,删除失败*/ { printf("删除记录成功!\n"); Travser (data,3); } else printf("删除记录失败!\n");
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: } void Travser(struct node L[],int n) /*遍历顺序表,输出顺序表中记录信息*/ { int i; printf("当前学生记录如下:\n"); printf("学号\t性别\t姓名\t成绩\n"); for(i=0;i<n;i++) /*依次访问顺序表中的每一个记录*/ printf("%-8s%-8s%-8s%-8d\n",L[i].num, L[i].sex,L[i].name,L[i].score);
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: } int Insert(struct node array[],struct node *node,char numm[20]) /*插入函数*/ { /*在指定的学号记录之前插入新的学生记录*/ int i=0; int j; while(strcmp(array[i].num,numm)!=0)
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: } int Insert(struct node array[],struct node *node,char numm[20]) /*插入函数*/ { /*在指定的学号记录之前插入新的学生记录*/ int i=0; int j; while(strcmp(array[i].num,numm)!=0) /*查找与指定的学号numm相等的学生记录的位置,i就是该位置*/ i++;
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: if(i>2) /*如果该位置超出了顺序表的实际长度,也就是实际存放的记录个数,则插入的位置没有找到,否则进行新记录插入操作*/ { printf("插入位置非法!"); return 0; } else { for(j=2;j>=i;j--) array[j+1]=array[j];
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: strcpy(array[i].num,node->num); strcpy(array[i].name,node->name); strcpy(array[i].sex,node->sex); array[i].score=node->score; return 1; }/*else结束*/ } int deletelist(struct node array[],char numm[20]) { int i=0; int j;
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: while(strcmp(array[i].num,numm)!=0) i++; if(i>3) { printf("删除位置非法!"); return 0; } else { for(j=i;j<=3;j++) array[j]=array[j+1]; return 1; } }
任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 【运行结果】
任务9.2 对顺序存储的学生记录进行插入、删除 9.2.1 顺序表的插入 图9-5 顺序表插入
任务9.2 对顺序存储的学生记录进行插入、删除 9.2.1 顺序表的插入 具体实现如下: void Inselem(List *L,int i,Elemtype x) { if (i<1 || i>L->length+1) { printf("Error!"); /*插入位置出错*/ exit(1); } if(L->length==MaxLen) { printf("overflow!"); /*表已满*/ exit(1);
任务9.2 对顺序存储的学生记录进行插入、删除 9.2.1 顺序表的插入 具体实现如下: } for(j=L->length-1;j>=i;j--) L->data[j+1]=L->data[j]; /*数据元素后移*/ L->data[i-1]=x; /*插入x*/ L->length++; /*表长度加1*/ }