当前位置:文档之家› 实验一 线性表基本操作的编程实现

实验一 线性表基本操作的编程实现

实验一线性表基本操作的编程实现【实验目的】线性表基本操作的编程实现要求:线性表基本操作的编程实现(2学时,验证型),掌握线性表的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、逆序、排序等操作,存储结构可以在顺序结构或链表结构中任选,可以完成部分主要功能,也可以用菜单进行管理完成大部分功能。

还鼓励学生利用基本操作进行一些更实际的应用型程序设计。

【实验性质】验证性实验(学时数:2H)【实验内容】把线性表的顺序存储和链表存储的数据插入、删除运算其中某项进行程序实现。

建议实现键盘输入数据以实现程序的通用性。

为了体现功能的正常性,至少要编制遍历数据的函数。

【注意事项】1.开发语言:使用C。

2.可以自己增加其他功能。

【思考问题】1.线性表的顺序存储和链表存储的差异?优缺点分析?2.那些操作引发了数据的移动?3.算法的时间效率是如何体现的?4.链表的指针是如何后移的?如何加强程序的健壮性?【参考代码】(以下内容,学生任意选择一个完成即可)(一)利用顺序表完成一个班级学生课程成绩的简单管理1、预定义以及顺序表结构类型的定义(1) #include<stdio.h>#include<conio.h>#define ListSize 100 //根据需要自己设定一个班级能够容纳的最大学生数(2) typedef struct stu{int num; //学生的学号char name[10]; //学生的姓名float physics; //物理成绩float math; //数学成绩float english; //英语成绩}STUDENT; //存放单个学生信息的结构体类型typedef struct List{STUDENT stu[ListSize]; //存放学生的数组定义,静态分配空间int length; //记录班级实际学生个数}LIST; //存放班级学生信息的顺序表类型2、建立班级的学生信息void listcreate(LIST *Li,int m) //m为该班级的实际人数{int i;Li->length=0;for(i=1; ;i++) //输入m个学生的所有信息{printf("请输入第%d位学生的信息:\n",i);printf("学号=");scanf("%d",&Li->stu[i].num); //输入第i个学生的学号printf("姓名=");scanf("%s",&Li->stu[i].name); //输入第i个学生的姓名printf("物理成绩=");scanf("%f",&Li->stu[i].physics); //输入第i个学生的物理成绩printf("数学成绩=");scanf("%f",&Li->stu[i].math); //输入第i个学生的数学成绩printf("英语成绩=");scanf("%f",&Li->stu[i].english); //输入第i个学生的英语成绩; //学生人数加1}}3、插入一个学生信息int listinsert(LIST *Li,int i) //将学生插入到班级Li的第i个位置。

{int j;STUDENT e;if(Li->length== ) //测试存储空间是否被占满{printf("无更多的存储空间!\n");return 0;}if (i<1||i>Li->length+1) //插入位置检验,如果错误就返回0退出程序。

return 0;else{printf("请输入插入的学生信息:\n");printf("学号=");scanf("%d",&e.num);printf("姓名=");scanf("%s",);printf("物理成绩=");scanf("%f",&e.physics);printf("数学成绩=");scanf("%f",&e.math);printf("英语成绩=");scanf("%f",&e.english);for(j=Li->length; ;j--) //从i位置到最后的元素依次往后移动Li->stu[j+1]= ;Li->stu[i]=e; //学生e放入到i位置Li->length++; //学生实际人数加1return 1;}}4、删除一个学生信息int listdel(LIST *Li,int i) //删除第i个学生的信息{int j;if (i<1||i>Li->length+1) //删除位置检验,如果错误就返回0退出程序。

return 0;else{if(i<Li->length)for( ;j<=Li->length;j++)//从删除位置后一个到最后的元素依次往前移动;Li->length--;return 1;}}5、显示所有学生信息void listdisplay(LIST *Li){int i;printf("班级学生信息如下:\n");printf("学号姓名物理成绩数学成绩英语成绩\n");for(i=1;i<=Li->length;i++)printf("%-10d%-10s%-10.2f%-10.2f%-10.2f\n",Li->stu[i].num,Li->stu[i].name,Li->stu[i].phy sics,Li->stu[i].math,Li->stu[i].english);}6、编写主函数main,要求测试以上的listcreat、listinsert、listdel和listdisplayvoid main(){LIST stu_info;int i,num;printf("请输入学生的总人数:");scanf("%d",&num);listcreate(&stu_info, );listdisplay(&stu_info);getch();printf("请输入待插入学生的位置:");scanf("%d",&i);printf("\n");listinsert(&stu_info, );getch();listdisplay(&stu_info);getch();printf("请输入需要删除学生的位置:");scanf("%d",&i);listdel(&stu_info, );getch();listdisplay(&stu_info);}(二)利用单链表完成一个班级学生课程成绩的简单管理1、单链表结构体类型的定义#define NULL 0#include<stdio.h>#include<conio.h>#include<stdlib.h>typedef struct Stu{int num; //学生的学号char name[10]; //学生的姓名float physics; //物理成绩float math; //数学成绩float english; //英语成绩}STUDENT; //存放单个学生信息的结构体类型typedef struct Snode{STUDENT data; //结点的值struct Snode *link; //指向下一个结点的地址}SNODE;2、建立班级学生信息SNODE *listcreate(int n) //n为该班级的实际人数{int i;SNODE *head,*p,*q;if(n==0)return NULL; //如果要创建的是空表,返回NULLhead=p=(SNODE *)malloc(sizeof(SNODE)); //动态建立第一个结点,head指针指向printf("请输入第1位学生的信息:\n");printf("学号=");scanf("%d",&p->data.num); //输入第1个学生的学号printf("姓名=");scanf("%s",p->); //输入第1个学生的姓名printf("物理成绩=");scanf("%f",&p->data.physics); //输入第1个学生的物理成绩printf("数学成绩=");scanf("%f",&p->data.math); //输入第1个学生的数学成绩printf("英语成绩=");scanf("%f",&p->data.english); //输入第1个学生的英语成绩for(i=2;i<=n;i++) //插入剩下的n-1个学生{printf("\n请输入第%d位学生的信息:\n",i);q=(SNODE *)malloc(sizeof(SNODE));printf("学号="); scanf("%d",&q->data.num);printf("姓名="); scanf("%s",q->);printf("物理成绩=");scanf("%f",&q->data.physics);printf("数学成绩=");scanf("%f",&q->data.math);printf("英语成绩=");scanf("%f",&q->data.english);q->link=NULL;p->link=q;p=q;}return head;}3、插入一个学生信息SNODE *listinsert(SNODE *Li_head,int i) //将学生插入到班级Li_head的第i个位置。

相关主题