ch02_2 线性表2-链式表示和实现
- 格式:ppt
- 大小:412.00 KB
- 文档页数:24


数学与计算科学学院实验报告实验项目名称线性表的链式表示与实现所属课程名称数据结构实验类型验证型实验日期班级学号姓名成绩2.调试第一次显示错误如下:原因:由于没有头文件及宏定义以及自定义,因此导致许多错误,可能还有许多错误没有显示3. 将以下语句编入VC++6.0中#include "stdio.h"#include "stdlib.h"#define OK 1#define ERROR 0typedef int ElemType;typedef int Status;4.调试第二次显示错误如下:原因:由于算法中许多变量没有定义,因此有许多错误5. 将以下语句加入算法中:int i;LinkList p;(加入创建链表的算法中)LinkList p;int j;(加入查找元素的算法中)LinkList p,s;int j;(加入插入元素的算法中)LinkList p,q;int j;(加入删除元素的算法中)6.调试第三次显示没有错误:7. 现在开始编写主函数:(1)先编写调用创建链表的函数的主函数:如下:void main(){LinkList L;int i,n;scanf("%d",&n);CreateList_L(L,n);for(i=n;i>0;--i)printf("%d ",L->data);printf("\n");}调试显示为:运行显示为:产生了随机数说明for循环语句那里编写错误因此修改为:LinkList p;for(p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);调试显示为:运行显示为:这次正确了那么继续编写下面的其他主函数,形成的总的主函数为:void main(){LinkList L,p;int i,n;scanf("%d",&n);CreateList_L(L,n);for(p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);printf("\n");ElemType e;scanf("%d", &i);GetElem_L(L, i, e);printf("%d\n",e);scanf("%d",&i);scanf("%d",&e);ListInsert_L(L, i, e);for(p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);printf("\n");scanf("%d", &i);ListDelete_L(L,i,e);printf("%d\n",e);for(p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);printf("\n");}8.调试第四次显示为:9.运行显示结果为:10. 但运行后的界面显得很单调;要是忘记下一个算法是什么就容易输入出错,也不适合大众使用;因此为了将程序优化,所以在主函数中增加以下输入输出语句和条件语句;为了让程序更加严谨,因此还加入一些循环语句以及条件语句,那么主函数语句变为:main(){LinkList L,p;int i,n,x,y,z;ElemType e;printf("请输入您想构建的链式表的元素个数:\n");scanf("%d",&n);printf("请输入您想构建的链式表:\n");CreateList_L(L,n);printf("您构建的链式表是:\n");for(p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);printf("\n");printf("请输入您想查找的元素是第几个元素:\n");scanf("%d", &i);for(x=2;(i<=0||i>n)&&x>=0;--x){switch(x){case 2:printf("输入的数字错误,还有两次重新输入符合要求的数字的机会:\n");break;case 1:printf("输入的数字错误,还有一次重新输入符合要求的数字的机会:\n");break;case 0:printf("输入的数字错误,您的输入机会已经用完\n");return ERROR;printf("%d ",p->data);printf("\n");return 0;}11.调试第五次显示为:、12.运行后结果显示为:这样那么程序就完整了,清晰明了,用户运行的时候也易知道自己要输入什么了【实验结论】(结果)。
//头文件Head.h#include <stdlib.h>//exit#define OVERFLOW -2#define NULL 0#define TRUE 1#define ERROR 0#define OK 1#define INFEASIBLE -1typedef int Status;typedef int ElemType;typedef struct LNode //结点类型{ElemType data;struct LNode *prior;struct LNode *next;} LNode,*LinkList;Status comp(ElemType c1,ElemType c2) //判定函数(平方关系) {if(c1==c2*c2)return TRUE;elsereturn ERROR;}void visit(ElemType &c) //被调用的函数{printf("%d ",c);}Status InitList(LinkList &L){//初始化// LinkList L;L=(LinkList)malloc(sizeof(LNode));//生成结点L->next=NULL;return OK;}Status DestroyList(LinkList &L){//摧毁while(L->next){L=L->next;free(L);}return OK;}Status ClearList(LinkList &L){//清空L->next=NULL;return OK;}Status ListEmpty(LinkList L){//判空if(L->next==NULL)return TRUE;return ERROR;}Status ListLength(LinkList &L){//长度LinkList p;p=L->next;int j=0;while(p){j++;p=p->next;}return j;}Status GetElem(LinkList L,int i,ElemType e){//取值LinkList p;p=L->next;int j=1;while(p&&j<i){p=p->next;j++;}if(!p||j>i)return ERROR;return OK;}int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType)) {//返回L中第1个与e满足关系compare()的数据元素的位序LinkList p;int i=0;//while(i<=ListLength(L)&&!compare(p->data,e))while(p&&!compare(p->data,e)){p=p->next;i++;}if(p)//////return i;return ERROR;}Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e) {//返回前驱LinkList p;int i=2;p=L->next;while(p&&p->data!=cur_e){i++;p=p->next;}if(!p)return INFEASIBLE;else{pre_e=p->prior->data;return pre_e;}}Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e) {//返回后继LinkList p;p=L;int i=1;while(p->next&&p->data!=cur_e){i++;p=p->next;}if(p==NULL)return INFEASIBLE;else{next_e=p->next->data;return next_e;}}Status ListInsert(LinkList &L,ElemType i,ElemType e){//插入LinkList p,s;p=L;int j=0;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1)return ERROR;s=(LinkList)malloc(sizeof(LNode));//生成新的结点s->data=e;s->next=p->next;p->next=s;return OK;}Status ListDelete(LinkList &L,ElemType i,ElemType &e){//删除LinkList p;p=L;int j=0;while(p&&j<i-1){p=p->next;++j;}if(!(p->next)||j>i-1)return ERROR;e=p->next->data;p->next=p->next->next;return OK;}Status ListTraverse(LinkList L){ //依次对L的每个数据元素调用函数vi()。