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

更新时间:2023-11-23 02:20:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

【实验目的】

线性表基本操作的编程实现 要求:

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

【实验性质】

验证性实验(学时数:2H)

【实验内容】

把线性表的顺序存储和链表存储的数据插入、删除运算其中某项进行程序实现。建议实现键盘输入数据以实现程序的通用性。为了体现功能的正常性,至少要编制遍历数据的函数。

【注意事项】

1.开发语言:使用C。

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

【思考问题】

1. 线性表的顺序存储和链表存储的差异?优缺点分析? 2. 那些操作引发了数据的移动? 3. 算法的时间效率是如何体现的?

4. 链表的指针是如何后移的?如何加强程序的健壮性?

【参考代码】(以下内容,学生任意选择一个完成即可)

(一)利用顺序表完成一个班级学生课程成绩的简单管理 1、预定义以及顺序表结构类型的定义 (1) #include

#include

#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\ printf(\学号=\

scanf(\输入第i个学生的学号 printf(\姓名=\

scanf(\输入第i个学生的姓名 printf(\物理成绩=\

scanf(\输入第i个学生的物理成绩 printf(\数学成绩=\

scanf(\输入第i个学生的数学成绩 printf(\英语成绩=\

scanf(\输入第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(\ printf(\姓名=\ scanf(\ printf(\物理成绩=\

scanf(\ printf(\数学成绩=\ scanf(\ printf(\英语成绩=\ scanf(\

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(ilength)

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(\sics,Li->stu[i].math,Li->stu[i].english); }

6、编写主函数main,要求测试以上的listcreat、listinsert、listdel和listdisplay void main() {

LIST stu_info; int i,num;

printf(\请输入学生的总人数:\

scanf(\

listcreate(&stu_info, ); listdisplay(&stu_info); getch();

printf(\请输入待插入学生的位置:\ scanf(\ printf(\

listinsert(&stu_info, ); getch();

listdisplay(&stu_info); getch();

printf(\请输入需要删除学生的位置:\ scanf(\

listdel(&stu_info, ); getch();

listdisplay(&stu_info); }

(二)利用单链表完成一个班级学生课程成绩的简单管理 1、单链表结构体类型的定义 #define NULL 0 #include #include #include 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(\ //输入第1个学生的学号 printf(\姓名=\

scanf(\ //输入第1个学生的姓名 printf(\物理成绩=\

scanf(\//输入第1个学生的物理成绩 printf(\数学成绩=\

scanf(\输入第1个学生的数学成绩 printf(\英语成绩=\

scanf(\输入第1个学生的英语成绩 for(i=2;i<=n;i++) //插入剩下的n-1个学生 {

printf(\请输入第%d位学生的信息:\\n\ q=(SNODE *)malloc(sizeof(SNODE));

printf(\学号=\scanf(\ printf(\姓名=\ printf(\物理成绩=\ printf(\数学成绩=\ printf(\英语成绩=\ 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(\ printf(\姓名=\

scanf(\ printf(\物理成绩=\

scanf(\ printf(\数学成绩=\

scanf(\ printf(\英语成绩=\

scanf(\

p=Li_head,q=NULL; //查找第i个结点,使p指向i,q指向第i-1个结点

本文来源:https://www.bwwdw.com/article/38gv.html

Top