实验一--线性表基本操作的编程实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一--线性表基本操作的编程实现
实验一线性表基本操作的编程实现
【实验目的】
线性表基本操作的编程实现
要求:
线性表基本操作的编程实现(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
{
p rintf("请输入插入的学生信息:\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++; //学生实际人数加1
return 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",L i->stu[i].num,Li->stu[i].name,Li->stu[i].physi cs,Li->stu[i].math,Li->stu[i].english);
}
6、编写主函数main,要求测试以上的listcreat、listinsert、listdel和listdisplay
void main()
{
L IST stu_info;
i nt i,num;
p rintf("请输入学生的总人数:");
s canf("%d",&num);
listcreate(&stu_info, );
l istdisplay(&stu_info);
g etch();
printf("请输入待插入学生的位置:");
s canf("%d",&i);
p rintf("\n");
listinsert(&stu_info, );
getch();
listdisplay(&stu_info);
g etch();
printf("请输入需要删除学生的位置:");
s canf("%d",&i);
listdel(&stu_info, );
g etch();
l istdisplay(&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; //如果要创建的是空表,返回NULL
head=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个位置。
{
SNODE *p,*q,*newsnode;
int m=0; //用来统计学生位置
if(i<1)
return Li_head; //插入位置检验,如果错误就返回0退出程序
newsnode=(SNODE *)malloc(sizeof(SNODE)); //产生新结点
printf("请输入待插入学生的信息:\n");
printf("学号=");
scanf("%d",&newsnode->data.num);
printf("姓名=");
scanf("%s",newsnode->);
printf("物理成绩=");
scanf("%f",&newsnode->data.physics);
printf("数学成绩=");
scanf("%f",&newsnode->data.math);
printf("英语成绩=");
scanf("%f",&newsnode->data.english);
p=Li_head,q=NULL; //查找第i个结点,使p 指向i,q指向第i-1个结点
while(p!=NULL)
{
m++;
if( )
break;
else
{
;
;
}
}
if(p==Li_head) //插入在表头
{
newsnode->link=p;
Li_head=newsnode;
}
else //插入在q和p之间
{
;
;
}
return Li_head;
}
4、删除一个学生信息
SNODE *listdel(SNODE *Li_head,int i) //删除链表Li_head中第i个学生的信息{
int m=0;
SNODE *p,*q;
p=Li_head;
q=NULL;
if(i<1||Li_head==NULL)//单链表为空及插入位置校验,如果错误就退出程序
return Li_head;
while(p!=NULL)
{
m++;
if(m==i)
break;
else
{
q=p;
p=p->link;
}
}
if(p==NULL) //i位置结点没有(超过最后一个结点)
return Li_head;
if(p==Li_head) //删除表头结点
Li_head=Li_head->link;
else //删除非表头结点
{
;
; //释放该结点所占的空间
}
return Li_head;
}
5、显示所有学生信息
void listdisplay(SNODE *Li_head)
{
printf("班级学生信息如下:\n");
printf("学号姓名物理成绩数学成绩英语成绩\n");
while(Li_head!=NULL)
{
printf("%-10d%-10s%-10.2f%-10.2f%-10.2f\n",
Li_head->data.num,Li_head->,Li_head-> data.physics,Li_head->data.math,Li_head->data. english);
;
}
}
6、编写主函数main,要求测试以上所编写的listcreat、listinsert、listdel和listdisplay void main() //自己设计主函数完成
{
SNODE *head=NULL;
int i,num;
printf("请输入学生的总人数:");
scanf("%d",&num);
head=listcreate( );
listdisplay(head);
getch();
printf("请输入待插入学生的位置:");
scanf("%d",&i);
printf("\n");
head=listinsert(head,i);
listdisplay(head);
getch();
printf("请输入需要删除学生的位置:");
scanf("%d",&i);
head=listdel(head, );
getch();
listdisplay(head); }
【实验小结】 (总结本次实验的重难点及心得、体会、收获)
得分_____________ 评阅日期_____________ 教师签名__ __________。