1 / 106

项目 9 学生记录操作

项目 9 学生记录操作. 项目 9 学生记录操作. 【 学习目标 】. (1) 熟悉链表的结构和用途。 (2) 掌握链表的创建和查找的方法。 (3) 熟练使用链表进行插入、删除操作。. 任务 9.1 对顺序存储的学生记录进行查找. 任务介绍. 对于学生信息记录,要求能够根据需要进行查找,现要求用顺序表实现对学生记录的查询操作,要求输入学生的学号,系统就能够显示该学号对应学生的详细信息。 顺序表的具体结构见表 9-1 。. 表 9-1 记录表. 任务 9.1 对顺序存储的学生记录进行查找. 任务介绍. 数据输入输出格式如下:.

debra
Download Presentation

项目 9 学生记录操作

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 项目9 学生记录操作

  2. 项目9 学生记录操作 【学习目标】 • (1) 熟悉链表的结构和用途。 • (2) 掌握链表的创建和查找的方法。 • (3) 熟练使用链表进行插入、删除操作。

  3. 任务9.1 对顺序存储的学生记录进行查找 任务介绍 对于学生信息记录,要求能够根据需要进行查找,现要求用顺序表实现对学生记录的查询操作,要求输入学生的学号,系统就能够显示该学号对应学生的详细信息。 顺序表的具体结构见表9-1。 表9-1 记录表

  4. 任务9.1 对顺序存储的学生记录进行查找 任务介绍 数据输入输出格式如下: 当前学生记录信息如下: 学号 性别姓名成绩 090101 女李燕98 090102 男李阳98 090103 女王娜78 请输入你要查找的学号:090102 查找的结果如下: 学号 性别姓名成绩 090102 男李阳98

  5. 任务9.1 对顺序存储的学生记录进行查找 解决思路 方法: S1:确定顺序表结构。 S2:初始化顺序表。 S3:输入学生记录,创建顺序表的节点信息。 S4:按照给定的学号进行顺序查找,如果找到,则输出查询结果信息;如果未找到,则输出查找失败信息。

  6. 任务9.1 对顺序存储的学生记录进行查找 解决思路 主函数框架如下: main() { printf("当前记录如下:\n"); 调用顺序表查找函数Locate; 输出查询结果; }

  7. 任务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;

  8. 任务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. 任务9.1 对顺序存储的学生记录进行查找 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: #include<string.h> #include<stdlib.h> #include<stdio.h> struct node /*定义节点结构*/ { char num[20]; /*定义学号*/ char sex[5]; /*定义性别*/ char name[20];

  10. 任务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;

  11. 任务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");

  12. 任务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++;

  13. 任务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");

  14. 任务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); }

  15. 任务9.1 对顺序存储的学生记录进行查找 任务实现 【运行结果】 由上面的代码可以看出,要实现这个任务,需要掌握如下知识点: (1) 顺序表的链式存储结构。 (2) 顺序表的初始化与创建。 (3) 顺序表的查找算法。

  16. (1) 顺序表所占的存储空间是连续的。 (2) 顺序表中各数据元素是按逻辑顺序依次存放的。 任务9.1 对顺序存储的学生记录进行查找 9.1.1 顺序表 顺序表具有以下两个基本特点:

  17. 任务9.1 对顺序存储的学生记录进行查找 9.1.1 顺序表 图9-1 顺序表存储结构

  18. 任务9.1 对顺序存储的学生记录进行查找 9.1.1 顺序表 图9-2 顺序表结构

  19. 任务9.1 对顺序存储的学生记录进行查找 9.1.1 顺序表 在C语言中,可用下述类型定义来描述顺序表: #define MaxLen 100 /*顺序表的容量*/ typedef int ElemType /*在实际应用中,将ElemType定义成实际类型*/ typedef struct { ElemType data[MaxLen]; /*定义存储表中元素的数组*/ int length; /*顺序表的实际长度*/ }List; List L; /*定义表结构的变量*/

  20. 任务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; }

  21. 任务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; /*线性表的实际长度*/

  22. 任务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; }

  23. 任务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);

  24. 任务9.1 对顺序存储的学生记录进行查找 9.1.2 查找运算locate(L,x)的实现 temp=Locate(&L,num); printf("你要查找的元素位置为:"); printf("%d",temp); printf("\n"); }

  25. 任务9.1 对顺序存储的学生记录进行查找 9.1.2 查找运算locate(L,x)的实现 【运行结果】 【运行结果分析】 在上述例子中,首先为顺序表中元素赋值,然后调用了顺序表中查找某元素位置的运算Locate(L,x)实现对输入元素位置的查找。

  26. 任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 对于学生信息记录,要求能够根据需要进行查找,如果所查找的学生记录不存在并能够动态地增加学生记录,现要求用线性表实现对学生记录的插入和删除操作。 线性表的具体结构见表9-2。 表9-2 线性表结构

  27. 任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 数据输入输出格式如下: 当前学生记录如下: 学号性别姓名成绩 090101 女李燕88 090102 男李阳98 090103 女王娜78 请输入插入点位置:090102 请输入要插入的记录数据:090104 男王强90 插入记录成功!

  28. 任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 数据输入输出格式如下: 当前学生记录如下: 090101 女李燕88 090104 男王强90 090102 男李阳98 090103 女王娜78 请输入要删除点位置:090104 当前学生记录如下: 090101 女李燕88 090102 男李阳98 090103 女王娜78

  29. 任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 方法: S1:确定顺序表结构。 S2:创建顺序表。 S3:按照给定的学号进行节点插入,如果插入成功,输出提示信息,并输出插入节点后学生记录。 S4:按照给定的学号进行节点删除,如果删除成功,输出提示信息,并输出插入节点后学生记录。

  30. 任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 主函数框架如下: main() { //初始化学生记录数据; //调用遍历函数,输出当前记录数据; //调用插入新记录函数Insert; //调用遍历函数,输出当前记录数据; //调用记录删除函数; //调用遍历函数,输出当前记录数据; }

  31. 任务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])

  32. 任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 各个子函数框架如下: /*插入函数*/ { int i=0; int j; while(strcmp(array[i].num,numm)!=0) i++; if(i>2) { printf("插入位置非法!"); return 0; } else

  33. 任务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]) {

  34. 任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 各个子函数框架如下: int i; while(strcmp(array[i].num,numm)!=0) i++; if(i>3) { printf("插入位置非法!"); return 0;

  35. 任务9.2 对顺序存储的学生记录进行插入、删除 解决思路 各个子函数框架如下: } else { for(j=i;j<=4;j++) array[j]=array[j+1]; return 1; }/*else结束*/ }

  36. 任务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);

  37. 任务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}};

  38. 任务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);

  39. 任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: /*调用顺序表插入函数,并把返回结果存放到标记变量flag中*/ if (flag) /*判断是否插入成功,如果flag为1,插入成功,为0,插入失败*/ { printf("插入记录成功!\n"); Travser (data,4); } else printf("插入记录失败!\n"); printf("请输入删除点的位置:"); /*输入删除记录的学号*/ scanf("%s",temp1);

  40. 任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: flag=deletelist(data,temp1); /*调用顺序表删除函数,并把返回值存放到标记变量flag中*/ if (flag) /*判断是否删除成功,如果flag为1,删除成功,为0,删除失败*/ { printf("删除记录成功!\n"); Travser (data,3); } else printf("删除记录失败!\n");

  41. 任务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);

  42. 任务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)

  43. 任务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++;

  44. 任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: if(i>2) /*如果该位置超出了顺序表的实际长度,也就是实际存放的记录个数,则插入的位置没有找到,否则进行新记录插入操作*/ { printf("插入位置非法!"); return 0; } else { for(j=2;j>=i;j--) array[j+1]=array[j];

  45. 任务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;

  46. 任务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; } }

  47. 任务9.2 对顺序存储的学生记录进行插入、删除 任务实现 【运行结果】

  48. 任务9.2 对顺序存储的学生记录进行插入、删除 9.2.1 顺序表的插入 图9-5 顺序表插入

  49. 任务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);

  50. 任务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*/ }

More Related