当前位置:文档之家› 数据结构实验参考讲解

数据结构实验参考讲解

数据结构实验一顺序表的基本操作实验目的:1.熟悉C语言上机环境,进一步掌握C语言结构特点2.掌握顺序表的逻辑结构和定义3. 掌握顺序表的生成、插入、删除和查找等基本运算实验要求:1.完成算法设计和程序设计,并上机调试通过2.完成实验报告,提供实验数据和结果3.对插入和删除算法进行时间复杂度的估算实验内容:实现顺序表的基本操作,使得对于线性表(6,9,14,23,28,50), 实现以下功能:1.从键盘依次往顺序表中输入数据2.在第3位插入数值10,输出顺序表3.删除第4位数值,输出整个顺序表.4.查找表中是否有数据24,有则返回其位置5.输出线性表中第i个元素的值,位序i由用户通过键盘输入请在实验中完成以下函数定义:PSeqList Init_SeqList( ) //初始化顺序表int Length_List (SeqList L) //求顺序表长void Disp_List(SeqList L) //输出顺序表int Locate_List(SeqList L,ElemType x) //在顺序表中检索查找xint Insert_List(PSeqList PL,int i,ElemType x)//向表中第i个元素前插入新元素xint Delete_List(PSeqList PL,int i) //删除第i个元素void Creat_List(PSeqList PL) //向顺序表中输入数据void ShowSelect(); //显示用户提示界面运行后,用户界面如下:思考题:1.函数调用时,实参何时使用取内容运算符*,何时使用取地址运算符& ?2.试编写一个算法,可以删除顺序表中从第i个元素起的k个元素。

在程序中实现算法并完成调用。

参考代码1 (秦锋格式定义):/*线形表的顺序存储,用指针做参数传递,顺序表采用数组存储,定义参考秦锋《数据结构》中定义格式*/#include<stdlib.h>#include<stdio.h>#define MAXSIZE 50#define FALSE 0#define TRUE 1/*数据元素类型ElemType 为int型*/typedef int ElemType;/*定义顺序表类型SeqList及指向顺序表的指针PSeqList*/typedef struct{ElemType data[MAXSIZE]; /*存放线性表的数组*/int length; /* length是顺序表的长度*/}SeqList, *PSeqList;/*初始化顺序表*/PSeqList Init_SeqList( ){PSeqList PL;PL=( PSeqList) malloc (sizeof(SeqList));if(PL!=NULL)PL->length=0;elseprintf("out of space!\n");return (PL);}/* 清空顺序表*/SeqList Clear_List (SeqList L){L.length=0;return L;}/* 求顺序表长度*/int Length_List (SeqList L){return(L.length);}/*遍历输出顺序表*/void Disp_List(SeqList L){int i;if(L.length==0)printf("顺序表为空\n");else{printf("顺序表中元素为:\n");for(i=0;i<L.length;i++)printf("%d\t",L.data[i]);printf("\n");}}/*检索查找,在线性表中查找元素x,并返回其位置,若查找不成功,则返回0*/ int Locate_List(SeqList L,ElemType x){int i=0;while(i<L.length && L.data[i]!=x)i++;if(i>=L.length)return 0;elsereturn(i+1);}/*向顺序表第i个元素前插入元素x,插入成功返回1,不成功返回0*/ int Insert_List(PSeqList PL,int i,ElemType x){int j;if(!PL){printf("顺序表不存在!");return 0;}if(i<1||i>PL->length+1){printf("插入位置不正确!\n");return 0;}for(j=PL->length-1;j>=i-1;j--)PL->data[j+1]=PL->data[j];PL->data[i-1]=x;PL->length++;return 1;}/*在线性表中插入元素x,使得线性表仍然有序*/int insert(PSeqList PL,ElemType x){int i,j;i=PL->length-1;while(x<PL->data[i])i--;for(j=PL->length-1;j>i;j--)PL->data[j+1]=PL->data[j];PL->data[i+1]=x;PL->length++;return 1;}/*删除线性表中第i个元素,成功删除元素,返回1,否则返回0*/int Delete_List(PSeqList PL,int i){int j;if(!PL){printf("顺序表不存在!");return 0;}if(i<1||i>PL->length){printf("删除位置不正确!\n");return 0;}for(j=i;j<=PL->length-1;j++)PL->data[j-1]=PL->data[j];PL->length--;return 1;}/* 删除线性表中从第i个元素起k个元素*/ int delk(PSeqList L,int i,int k){int j;if(i<0 || i+k-1>L->length){printf("error!");return 0;}else{for(j=i+k-1;j<L->length;j++)L->data[j-k]=L->data[j];L->length=L->length-k;return 1;}}/*向顺序表中顺序输入元素*/void Creat_List(PSeqList PL){int i;printf("输入数据不得超过50个!\n"); printf("输入顺序表中元素个数:\n");scanf("%d",&PL->length);for(i=1;i<=PL->length;i++){printf("input the %d number:",i);scanf("%d",&PL->data[i-1]);}}/*显示选择提示信息函数*/void ShowSelect(){ printf("\n请选择要执行的操作:\n");printf("-------------------------\n");printf(" 1----初始化\n");printf(" 2----为顺序表输入元素\n");printf(" 3----求顺序表长度\n");printf(" 4----遍历输出顺序表\n");printf(" 5----在顺序表中检索查找\n");printf(" 6----向顺序表中插入元素\n");printf(" 7----从顺序表中删除元素\n");printf(" 0---- 退出\n");printf("-------------------------\n");printf("please input number 0~~7 \n\n");}int main(void){PSeqList PL=NULL;int i,x,flag;int len; /*表示顺序表长*/int select; /*select变量表示用户的选择项*/ShowSelect();scanf("%d",&select);while(select!=0){switch(select){case 1: PL=Init_SeqList( ); break;case 2: Creat_List(PL);break;case 3: len=Length_List(*PL); printf("顺序表长为%d\n",len);break; case 4: Disp_List(*PL);break;case 5: printf("\n请输入你想查找的数据:");scanf("%d",&x);flag= Locate_List(*PL, x);if(flag)printf("该元素在顺序表中的位置是:%d\n",flag) ;elseprintf("该元素在顺序表中不存在");break;case 6: printf("请输入要插入的元素的值和位置,用空格分隔:\n");scanf("%d %d",&x,&i);flag=Insert_List(PL,i,x);if(flag) printf("插入操作成功");break;case 7: printf("请输入要删除的元素的位置:\n");scanf("%d",&i);flag= Delete_List(PL,i);if(flag) printf("删除操作成功");break;}ShowSelect();scanf("%d",&select);}}实验二链表的基本操作实验目的:1.进一步熟悉C语言上机环境,进一步掌握C语言结构特点2. 掌握单链表的逻辑结构和定义3. 掌握单链表的生成、插入、删除和查找等基本运算实验要求:1.完成算法设计和程序设计,并上机调试通过2.完成实验报告,提供实验数据和结果3.对插入和删除算法进行时间复杂度的估算实验内容:实现单链表的基本操作,使得对于线性表(6,9,14,23,28,50), 实现以下功能:1.从键盘依次往顺序表中输入数据2.在第3位插入数值10,输出顺序表3.删除第4位数值,输出整个顺序表.4.查找表中是否有数据24,有则返回其位置5.输出线性表中第i个元素的值,位序i由用户通过键盘输入请在实验中完成以下函数定义并调用它们:LinkList Init_LinkList( ) //初始化单链表void Creat_List(LinkList L ,int n) // 按逆序产生一个链表长度为nint Length_List (LinkList L ) //求单链表表长void Disp_List(LinkList L) //依次输出单链表中元素//在单链表中检索查找x,找不到返回0,否则返回在线性表中的位序int Locate_List(LinkList L,ElemType x)//向表中第i个元素前插入新元素xint Insert_List(LinkList L,int i,ElemType x)//删除单链表中第i个元素int Delete_List(LinkList L,int i)//实现单链表的逆置void Reverse_LinkList(LinkList L)用户界面如图:实验小结及思考:1.总结单链表结构特点2.试编写算法,在一个带头结点的单链表中删除最小值结点参考代码/*单链表结构定义各书差不多,只名称有区别,本程序名称定义按秦峰版*//*本程序为带头结点单链表*/#include<stdlib.h>#include<stdio.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define Null 0typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode ,*LinkList;/*初始化单链表,即产生一个带头结点的空表,创建成功则返回空表的头指针*/ LinkList Init_List(void){LinkList L;L=(LinkList) malloc(sizeof(LNode));if(L)L->next=NULL; //产生空表,头结点的next域为空return L;}/*按逆序产生一个长度为n链表,参数为初始化的空链表,及线性表长度n*//*每个元素依次插入在头结点后*/int Create_List(LinkList L,int n){int i;LinkList s; /*s变量用于保存新结点地址*/printf("生成有%d个元素的线性表:\n",n);for(i=n;i>0;i--){ printf("请输入线性表中第%d 个元素:\n",i); /*逆序输入元素*/s=(LinkList)malloc(sizeof(LNode));if(!s){printf("创建结点不成功\n");return 0;}scanf("%d",&s->data);s->next=L->next;L->next=s;}return 1;}/* 求单链表表长,返回L中数据元素个数*/int Length_List(LinkList L){int i=0;LinkList p=L->next;while(p){i++;p=p->next;}return i;}/* 当按位置查找元素,第i个元素存在时,其值赋给e并返回1,否则返回0 */ int GetElem_List(LinkList L,int i,ElemType *e){int j=0;LinkList p=L;while(p&&j<i){p=p->next;j++;}if(!p||j>i){ printf("链表不存在或参数i错");return 0;}*e=p->data; /* 取第i个元素*/return 1;}/* 按元素查找,查找链表中是否存在值为e的元素,存在,则返回L中第一个e元素的位序,若不存在,则返回值为0 */int Locate_List(LinkList L,ElemType e){int i=0;LinkList p=L;while(p&&p->data!=e){ p=p->next;i++;}if(p)return i;elsereturn 0;}/* 在带头结点的单链线性表L中第i个位置之前插入元素e */int Insert_List(LinkList L,int i,ElemType e){int j=0;LinkList p=L,s;while(p&&j<i-1){p=p->next;j++;}if(!p||j>i-1)return ERROR;s=(LinkList)malloc(sizeof(struct LNode));s->data=e;s->next=p->next;p->next=s;return OK;}int Delete_List(LinkList L,int i,ElemType *e) /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/{int j=0;LinkList p=L,q;while(p->next&&j<i-1)p=p->next;j++;}if(!p->next||j>i-1)return 0;q=p->next;p->next=q->next;*e=q->data;free(q);return 1;}int Disp_List(LinkList L)/*显示单链表*/{LinkList p=L->next;if(p==Null) printf("单链表为空表");else{printf("输出单链表:\n");while(p!=Null){printf("%d",p->data);printf("->");p=p->next;}}printf("\n");return 1;}/*以下函数为作业中常见练习,不是基本操作,也未在主函数中调用*//*删除单链表中多余的元素值相同的结点*/void DelRepeat_List(LinkList L){LinkList p,h,pre;h=L->next;if(h==NULL){printf("是一个空表");return;}p=L->next->next;if(p==NULL)printf("表中只有一个结点");return;}while(h->next!=NULL){ pre=h;p=pre->next;while(p){if(h->data==p->data){pre->next=p->next;free(p);p=pre->next;}else{pre=p;p=p->next;}}h=h->next;}}/*显示选择提示信息函数*/void ShowSelect(){ printf("\n请选择要执行的操作:\n");printf("-------------------------\n");printf(" 1----初始化\n");printf(" 2----逆序输入元素\n");printf(" 3----求单链表长度\n");printf(" 4----遍历输出顺序表\n");printf(" 5----在单链表中检索查找\n");printf(" 6----向单链表中插入元素\n");printf(" 7----从单链表中删除元素\n");printf(" 0---- 退出\n");printf("-------------------------\n");printf("please input number 0~~7 \n\n"); }int main(void){LinkList PL=NULL;int i,x,flag;int len; /*表示单链表长*/int select; /*select变量表示用户的选择项*/ShowSelect();scanf("%d",&select);while(select!=0){switch(select){case 1: PL=Init_List(); break;case 2: printf("请输入线性表中元素个数:\n");scanf("%d",&len);Create_List(PL,len);break; case 3: len=Length_List(PL); printf("单链表表长为%d\n",len);break;case 4: Disp_List(PL);break;case 5: printf("\n请输入你想查找的数据:");scanf("%d",&x);i= Locate_List(PL, x);if(flag)printf("该元素在顺序表中的位置是:%d\n",i) ;elseprintf("该元素在顺序表中不存在");break;case 6: printf("请输入要插入的元素的值和位置,用空格分隔:\n");scanf("%d %d",&x,&i);flag=Insert_List(PL,i,x);if(flag) printf("插入操作成功");break;case 7: printf("请输入要删除的元素的位置:\n");scanf("%d",&i);flag= Delete_List(PL,i,&x);if(flag) printf("删除操作成功");break;case 8: DelRepeat_List(PL);}ShowSelect();scanf("%d",&select);}}实验三线性表的应用----稀疏多项式计算器(vc环境,&符号)#include<malloc.h>#include<stdio.h>#define Null 0typedef struct LNode /* 项的表示,多项式的项作为LinkList的数据元素*/{int coef; /* 系数*/int expn; /* 指数*/struct LNode *next;}LNode,*LinkList;typedef LinkList polynomial; /* 用带有表头结点的有序链表表示多项式*/void CreatePolyn(polynomial &L) /*按尾插法产生一个n项多项式*/{int i,n;polynomial p,s;L=(polynomial)malloc(sizeof(LNode));L->next=Null;p=L;printf("请输入该多项式的总项数:\n");scanf("%d",&n);for(i=1;i<=n;i++){printf(" 输入第%d 项系数,指数(用,号分隔)\n",i);s=( polynomial )malloc(sizeof(LNode));scanf("%d,%d",&s->coef, &s->expn);p->next=s;p=s;}p->next=Null;}int ListLength(polynomial L) /* 返回L中数据元素个数*/{int i=0;polynomial p=L->next;while(p){i++;p=p->next;}return i;}int LocateElem(polynomial L,int e)/* 返回L中e的数据元素的位序,若不存在,则返回值为0 */{ int i=0;polynomial p=L->next;while(p){i++;if(p->expn==e) /* 找到这样的数据元素*/return i;p=p->next;}return 0;}void DispPolyn(polynomial L)/*显示多项式表*/{LinkList p=L->next;if(p==Null) printf("the list is not exit!");else{printf("多项式共%d项:", ListLength(L));while(p!=Null){printf("%d,%d",p->coef,p->expn); //按先系数,后指数的顺序显示一个多项式printf("->");p=p->next;}}printf("\n");}//求一元多项式的导数void Polyn(polynomial &La){polynomial p=La->next,q=La;while(p){if(p->expn!=0){ p->coef =(p->coef)*(p->expn);p->expn --;p=p->next ;}else{ q->next =p->next;p=p->next ;}}}void Addpolyn(polynomial &La, polynomial &Lb)// 按系数递增有序的多项式,执行相加操作,使之仍按系数递增有序,利用原表结构{ LinkList pa=La->next,pb=Lb->next,pc,r;pc=La;La->next =Null;while(pa&&pb){ if(pa->expn<pb->expn){ pc->next=pa;pc=pa;pa=pa->next;}else if(pa->expn>pb->expn){ pc->next=pb;pc=pb;pb=pb->next;}else{ if(pa->coef+pb->coef==0) //若两个多项式的项指数相同,则看其系数,若系数和为0,则两项结点空间都释放{ r=pa;pa=pa->next;free(r);r=pb;pb=pb->next;free(pb);}else //若系数和不为零,则将两项的系数相加{pc->next=pa;pa->coef=pa->coef+pb->coef ;pc=pa;pa=pa->next;r=pb;pb=pb->next;free(pb);}}}if(pa)pc->next=pa;elsepc->next=pb;}void main(){polynomial L=Null,P=Null ;printf("输入第一个多项式(L):\n ");CreatePolyn(L);printf(" 输入第二个多项式(P):\n ");CreatePolyn(P);DispPolyn(L);DispPolyn(P);printf(" L+P的结果:");Addpolyn(L,P);DispPolyn(L);}第三章栈和队列实验一栈及其应用实验目的: 1.深入了解栈的特性2.熟练掌握两种存储结构和基本运算的实现算法3.了解栈空和栈满的判断条件实验内容: 顺序栈实现将十进制整数转换为r(2、8、16)进制数实验要求:由用户通过键盘输入十进制整数n和要转换成的进制r。

相关主题