1、数据结构实验报告数据结构实验所属学院及班级:信息工程学院计算机科学与技术091班学生姓名:学生学号:时间: 2010-3 至 2010-6实验1:C 语言基础练习姓名: 学号: 专业班级:计算机科学与技术091班 一、实验目的对C语言的复习,增强学生对结构体数组和指针的学习,尤以结构体的应用和指针的操作作为重点。二、问题描述1、 构造一个学生结构体数组,成员包括学号,姓名,四门成绩,以及平均成绩;2、 从键盘上输入学生的学号,姓名和四门成绩;3、 找出学生中考试没有通过的学生姓名并输出;找出考试在90分以上的学生并输出。三、实验要求1、 要求用链表存储学生的记录,并设计出输入和查找的基本操作算
2、法。2、 在实验过程中,分析算法的时间复杂度和空间复杂度进行分析。四、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、算法分析创建一个学生结构体数组,其中包括指向下一个学生的指针。用链表存储学生的记录,指针指向学生结构体数组的成员,输入数据存放在相应位置。用p=p-next实现链表的滑动,查找链表上的相关信息。六、实验内容和过程1、 用所选择的语言实现算法;【程序清单】#include#include#define LEN sizeof(struct stu) /宏定义结构体的长度为LEN#define NULL 0
3、struct stu /定义一个学生结构体数组long int num; /学生学号char name20; /学生姓名float score4; /记录学生四门成绩的数组float averSocre; /平均成绩struct stu *next; /指向下一个学生的指针;float aver(struct stu st) /计算平均成绩的函数float sum=0;int i;for(i=0;inum);if(p1-num=0)return(head);printf(输入学生姓名:);scanf(%s,&p1-name);printf(输入学生成绩一:);scanf(%f,&p1-scor
4、e0);printf(输入学生成绩二:);scanf(%f,&p1-score1);printf(输入学生成绩三:);scanf(%f,&p1-score2);printf(输入学生成绩四:);scanf(%f,&p1-score3);printf(*n);p1-averSocre=aver(*p1);head=NULL;while(p1-num)n=n+1;if(n=1)head=p1;elsep2-next=p1 ; /将p1所指内容赋给p2p2=p1;p1=(struct stu*)malloc(LEN); /继续输入学生的成员值printf(*n);printf(输入学生学号:);sc
5、anf(%d,&p1-num);if(p1-num=0)break; /如果输入的学生的学号为,则结束输入,跳出循环体printf(输入学生姓名:);scanf(%s,&p1-name);printf(输入学生成绩一:);scanf(%f,&p1-score0);printf(输入学生成绩二:);scanf(%f,&p1-score1);printf(输入学生成绩三:);scanf(%f,&p1-score2);printf(输入学生成绩四:);scanf(%f,&p1-score3);printf(*n);p1-averSocre=aver(*p1);p2-next=NULL; /链表表尾指
6、空return(head);void main()void pass(struct stu *p4);struct stu *p3;p3=creat(); /创建学生结构体pass(p3); /成绩优秀及不及格的学生并输出学生相关信息getchar(); /等待输入,便于查看输出结果getchar();void pass(struct stu*p4) /选择成绩优秀及不及格的学生并输出学生相关信息int i;printf(*n);while(p4!=NULL)for(i=0;iscoreiname,p4-num,p4-score0,p4-score1,p4-score2,p4-score3,p
7、4-averSocre);break;else if(p4-scorei=90)printf(%s 【优秀】n学号: %ldn成绩分别为:%f,%f,%f,%fn平均分:%fn,p4-name,p4-num,p4-score0,p4-score1,p4-score2,p4-score3,p4-averSocre);break;p4=p4-next;printf(*n);2、 测试程序,并对算法进行时间和空间复杂度分析。七、实验结果八、总结和感想对C 语言基础练习的实验并不是老师要求做的实验,但我还是认真的做了,因为我觉得需要复习一下之前学过的C语言内容。因为我们用的教材是C+版的数据结构,与C
8、语言版的数据结构在描述一种数据结构上还是有区别的,C语言是用结构体而C+是用类。通过本次实验对结构体的知识做了一定的复习和了解,也复习了课本上的知识。一开始看到实验题目就想用以前学过的知识直接编程出来,但是才发现是要用链表来存储,这与数组存储相比还是比较困难的,查阅了很多资料终于做出来了,我觉得对我接下来的实验来说是次很好的基础。实验2:线性表及其应用姓名: 学号: 专业班级:计算机科学与技术091班 一、实验目的帮助学生掌握线性表的基本操作在顺序和链表这两种存储结构上的实现,尤以链表的操作和应用作为重点。二、问题描述1. 构造一个空的线性表L。2. 在线性表L的第i个元素之前插入新的元素e;
9、3. 在线性表L中删除第i个元素,并用e返回其值。三、实验要求1、 分别利用顺序和链表存储结构实现线性表的存储,并设计出在不同的存储结构中线性表的基本操作算法。2、 在实验过程中,对相同的操作在不同的存储结构下的时间复杂度和空间复杂度进行分析。四、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、算法分析【顺序存储的核心算法描述】插入:顺序表的插入操作是指在线性表的第i-1个数据元素和第i个数据元素之间插入一个新的数据元素,使长度为n的线性表变成长度为n+1的线性表,数据元素ai-1和ai之间的逻辑关系发生了变化 。因
10、此,除非i=n+1,否则必须移动元素才能反映这个逻辑上的变化。一般情况下,在第i(1in)个元素之前插入一个元素时,需将第n至第i(共n-i+1)个元素向后移动一个位置。删除:顺序表的删除操作是使长度为n的线性表变成长度为n1的线性表,数据元素ai-1、ai和ai+1之间的逻辑关系发生了变化 。一般情况下,删除第i(1in)个元素时需将第i+1至第n(共n- 1)个元素向前移动一个位置。【链式存储的核心算法描述】插入:链表的插入操作是将值为x的新结点插入到表的第i个结点的位置上,即插入到ai-1与ai之间。具体步骤:(1)找到ai-1存储位置p(2)生成一个数据域为x的新结点*s(3)令结点*
11、p的指针域指向新结点(4)新结点的指针域指向结点ai。删除:链表的删除操作是将表的第i个结点删去。具体步骤:(1)找到ai-1的存储位置p(因为在单链表中结点ai的存储地址是在其直接前趋结点ai-1的指针域next中。(2)令p-next指向ai的直接后继结点(即把ai从链上摘下)(3)释放结点ai的空间。六、实验内容和过程我选择的是C语言来设计实现线性表的顺序和链表存储结构,并在这两种存储结构下实现线性表的插入、删除算法。顺序表和链表的程序代码清单如下:【顺序表程序清单】#include#include#define ElemType char#define LIST_INIT_SIZE 1
12、00#define LISTINCREMENT 10#define OVERFLOW 0#define OK 1typedef struct ElemType *elem; /顺序表中的元素指针 int length; /顺序表的长度 int listsize; /顺序表的大小SqList;/顺序表的初始化功能int InitList(SqList &L) L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType); if(!L.elem) return OVERFLOW; L.length=0; L.listsize=LIST_INIT
13、_SIZE; return OK; /顺序表的插入操作int ListInsert(SqList &L,int i,ElemType e) if(iL.length+1) return 0; /如果越界 则返回0 if(L.length=L.listsize) ElemType *newbase; newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType); if(!newbase) return OVERFLOW; L.elem=newbase; L.listsize += LISTINC
14、REMENT; ElemType *q; ElemType *p; q=L.elem+i-1; for(p=L.elem+L.length-1;p=q;-p) *(p+1)=*p; *q=e; +L.length; return OK;/删除第i个结点并返回e值 int ListDelete(SqList &L,int i,ElemType &e) if(iL.length) return 0; ElemType *p; ElemType *q; p=&(L.elemi-1); e=*p; q=L.elem+L.length-1; for(+p;p=q;+p) *(p-1)=*p; -L.le
15、ngth; return OK;/输出顺序表的函数void Print(SqList &L) printf(n*n); printf( 当前顺序表为:n); printf( ); for(int i=0;iL.length;i+) printf(%1c,L.elemi); printf(n);/顺序表的输入函数void Input(SqList &L) int n; ElemType e; InitList(L); printf(n*n); printf( 请输入顺序表中元素的个数:); scanf(%d,&n);fflush(stdin); /清空缓冲区 printf(n 请输入顺序表中的元
16、素:); for(int i=0;in;i+) scanf(%c,&e); ListInsert(L,i+1,e); Print(L);/顺序表插入操作的测试函数void insert() SqList L; int i; ElemType e; Input(L); printf(n*n); printf( 请输入要插入的元素的位置:); scanf(%d,&i);fflush(stdin); printf(n); printf( 请输入要插入的元素:); scanf(%c,&e);fflush(stdin); ListInsert(L,i,e); Print(L);/顺序表删除操作的测试函数
17、void deletei() SqList L; int i; ElemType e; Input(L); printf(*n); printf( 请输入要删除的元素的位置:); scanf(%d,&i);fflush(stdin); /清空缓冲区 ListDelete(L,i,e); Print(L);void main() SqList L; int choose,flag; flag=1; while(flag) printf(* 顺序表操作 *n); printf( 1.在第i个元素之前插入一个元素n); printf( 2.删除第i个元素n); printf( 其他.结束); pri
18、ntf(n*n); printf( ); scanf(%d,&choose); switch(choose) case 1: insert(); break; case 2: deletei(); break; default: flag=0; break; getchar(); 【链表程序清单】/链表的初始化、插入、删除算法#include#include#include#define ElemType char#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define OVERFLOW 0#define OK 1typedef str
19、uct LnodeElemType data;struct Lnode * next;Lnode, * Linklist; /头指针/链表初始化int InitLinklist(Linklist &L) L=(Linklist)malloc(sizeof(Lnode); if(!L) return OVERFLOW; L-next=NULL;/定义指针域为空 return OK;int getlength(Linklist &L) /获得链表中的结点数 int i=0; if(!L) return 0; Linklist p=L-next; while(p!=NULL) +i; p=p-nex
20、t; return i+1;/向链表中插入元素int ListInsert(Linklist & L, int i, ElemType e) /在带头节点的单链表L中第i个位置之前插入元素e Linklist p=L; int j=1; if(idata=e; if(i=1)/插入L中 s-next=L; L=s; else while(p&jnext; if(!p) return 0; s-next=p-next; p-next=s; return OK;/向链表中删除元素int ListDelete(Linklist &L,int i) /在带头结点的单链表L中删除第i个数据元素元素 Li
21、nklist p; p=L; int j=1; if(!L) return 0; else if(i=1) L=p-next; free(p); else while(p-next&jnext; j+; if(!(p-next)|ji-1) /删除位置不合理 return 0;/删除并释放结点 Linklist q=p-next; p-next=q-next;/即使是删除最后一个元素,空指针也能继承 free(q); return 1;/显示链表的函数void Print(Linklist &L) Linklist p; p=L; printf(*n); printf( 当前链表为:n); p
22、rintf( ); int m=getlength(L); for(int i=0;idata ,p-data); p=p-next; printf(n);/输入链表的函数void Input(Linklist &L) int n; ElemType e; InitLinklist(L); printf(*n); printf( 请输入链表中结点的个数:); scanf(%d,&n);fflush(stdin); /用于清空缓冲区 printf(n 请输入链表的结点:); for(int i=0;in;i+) /e=getchar(); scanf(%c,&e); ListInsert(L,i
23、+1,e); Print(L);/插入的测试函数void insert() Linklist L; int i,n; ElemType e; Input(L); printf(*n); printf( 请输入要插入的元素的位置:); scanf(%d,&i);fflush(stdin); /用于清空缓冲区 printf(n); printf( 请输入要插入的元素:); /e=getchar(); scanf(%c,&e); ListInsert(L,i,e); Print(L);/删除的测试函数void deletei() Linklist L; int i; ElemType e; Input(L); printf(*n); printf( 请输入要删除的元素的位置:); scanf(%d,&i);fflush(stdin); /printf(n请输入要删除的元素:); /scanf(%d,&e); ListDelete(L,i); Print(L);void main() Linklist L; int i; ElemType e; in
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1