实验二单链表基本操作技巧_第1页
实验二单链表基本操作技巧_第2页
实验二单链表基本操作技巧_第3页
实验二单链表基本操作技巧_第4页
实验二单链表基本操作技巧_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

!-实验二单链表基本操作一实验目的1.学会定义单链表的结点类型,实现对单链表的一些基本操作和具体的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。精品文档放心下载2.掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。精品文档放心下载二 实验要求1.预习C语言中结构体的定义与基本操作方法。2.对单链表的每个基本操作用单独的函数实现。3.编写完整程序完成下面的实验内容并上机运行。4.整理并上交实验报告。三实验内容1.编写程序完成单链表的下列基本操作:(1)初始化单链表La。(2)在La中第i个元素之前插入一个新结点。谢谢阅读(3)删除La中的第i个元素结点。(4)在La中查找某结点并返回其位置。(5)打印输出La中的结点元素值。.构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。谢谢阅读合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指谢谢阅读La表与Lb表中当前待比较插入的结点,pc指向Lc表中当前最后一个结点。依次扫描La和Lb中的元素,比较当前元素的值,将较小者链接到*pc之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。感谢阅读3.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。)感谢阅读思考与提高1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作?谢谢阅读2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?感谢阅读!-1.编写程序完成单链表的下列基本操作:(1)初始化单链表La。(2)在La中第i个元素之前插入一个新结点。感谢阅读(3)删除La中的第i个元素结点。(4)在La中查找某结点并返回其位置。(5)打印输出La中的结点元素值。#include<stdio.h>#include<stdlib.h>#include<malloc.h>#defineOK1#defineERROR0typedefintStatus;typedefintElemType;//定义存储结构typedef struct Lnode{intdata; /*每个元素数据信息*/structLnode*next; /*存放后继元素的地址*/精品文档放心下载}LNode,*LinkList;intmain(){voidCreate_L(LinkList&L,intn);感谢阅读voidPrint_L(LinkListL);StatusListInsert_L(LinkList&L,inti,ElemTypee);谢谢阅读StatusListDelete_L(LinkList&L,inti,ElemType&e);感谢阅读StatusFind_L(LinkListL,inte);谢谢阅读LinkListLa;//创建单链表Laintn;printf("请输入链表La中的元素个数:\n");感谢阅读scanf("%d",&n);Create_L(La,n);//初始化单链表printf("现在La中的元素为:\n");Print_L(La);printf("-------------------------------------\n\n");感谢阅读printf("现在准备插入元素,请输入插入位置及所插入元素的值\n");inti,e;精品文档放心下载scanf("%d%d",&i,&e);ListInsert_L(La,i,e);!-printf("插入后La中的元素为:\n");谢谢阅读Print_L(La);printf("-------------------------------------\n\n");精品文档放心下载printf("现在准备删除元素,请输入删除位置\n");精品文档放心下载scanf("%d",&i);ListDelete_L(La,i,e);printf("删除后La中的元素为:\n");谢谢阅读Print_L(La);printf("-------------------------------------\n\n");感谢阅读printf("请输入所要查找元素的值:\n");scanf("%d",&e);Find_L(La,e);printf("所要查找元素的位置为:%d\n",Find_L(La,e));谢谢阅读}voidCreate_L(LinkList&L,intn)感谢阅读{intj=1;L=(LinkList)malloc(sizeof(Lnode));谢谢阅读L->next=NULL;//先建立一个带头结点的单链线性表L精品文档放心下载for(inti=n;i>0;--i){LinkListp=(LinkList)malloc(sizeof(Lnode));精品文档放心下载printf("请输入链表La中的第%d个元素:\n",j++);感谢阅读scanf("%d",&p->data);p->next=L->next;L->next=p;}//(逆序实现)/*LinkListq=L;for(inti=1;i<=n;i++){LinkListp=(LinkList)malloc(sizeof(Lnode));精品文档放心下载q->next=p;p->next=NULL;q=q->next;printf("请输入链表La中的第%d个元素:\n",i);感谢阅读!-scanf("%d",&p->data);}//(正序实现)*/}//初始化单链表//输出单链表voidPrint_L(LinkListL){LinkListp;p=L->next;while(p){printf("%d ",p->data);p=p->next;}printf("\n");}//在单链表L的第i个位置前插入元素eStatusListInsert_L(LinkList&L,inti,ElemTypee)谢谢阅读{LinkListp=L;intj=0;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1) returnERROR;精品文档放心下载LinkLists=(LinkList)malloc(sizeof(LNode));精品文档放心下载s->data=e;s->next=p->next;感谢阅读p->next=s;returnOK;}//ListInsert_L//删除单链表L中第i个位置上的元素StatusListDelete_L(LinkList&L,inti,ElemType&e)谢谢阅读{LinkListp=L;intj=0;while(p->next&&j<i-1){!-p=p->next;++j;}if(!p->next||j>i-1) returnERROR;感谢阅读LinkListq=p->next;p->next=q->next;感谢阅读e=q->data;free(q);returnOK;}//LinkDelete_L/*查找元素并返回位置*/StatusFind_L(LinkListL,inte)感谢阅读{LinkListp=L->next;intj=1;while(p->data!=e&&p->next)感谢阅读{p=p->next;j++;}if(p->data==e)returnj;else{printf("无当前元素\n");returnERROR;}if(!p){printf("无当前元素\n");returnERROR;}}//定位2.构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。感谢阅读合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc指向Lc表中当前最后一个结点。依次扫描La和Lb中的元素,比较当前元素的值,将较小者链接到*pc之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。感谢阅读!-#include<stdio.h>#include<stdlib.h>#include<malloc.h>#defineOK1#defineERROR0typedefintStatus;typedefintElemType;//定义存储结构typedef struct Lnode{intdata; /*每个元素数据信息*/structLnode*next; /*存放后继元素的地址*/精品文档放心下载}LNode,*LinkList;voidmain(){voidCreate_L(LinkList&L,intn);感谢阅读voidPrint_L(LinkListL);voidMergeList_L(LinkList&La,LinkList&Lb,LinkList&Lc);谢谢阅读LinkListLa,Lb,Lc;//创建单链表La,Lb,Lc感谢阅读intn;printf("请输入链表La中的元素个数:\n");精品文档放心下载scanf("%d",&n);Create_L(La,n);//初始化单链表printf("现在La中的元素为:\n");Print_L(La);printf("请输入链表Lb中的元素个数:\n");精品文档放心下载scanf("%d",&n);Create_L(Lb,n);//初始化单链表printf("现在Lb中的元素为:\n");Print_L(Lb);Create_L(Lc,0);printf("-------------------------------------\n\n");感谢阅读printf("开始合并:\n");MergeList_L(La,Lb,Lc);printf("-------------------------------------\n\n");谢谢阅读printf("合并后,Lc的元素为\n");Print_L(Lc);}!-voidCreate_L(LinkList&L,intn)精品文档放心下载{intj=1;L=(LinkList)malloc(sizeof(Lnode));感谢阅读L->next=NULL;//先建立一个带头结点的单链线性表L感谢阅读for(inti=n;i>0;--i){LinkListp=(LinkList)malloc(sizeof(Lnode));精品文档放心下载printf("请输入链表中的第%d个元素:\n",j++);精品文档放心下载scanf("%d",&p->data);p->next=L->next;L->next=p;}//(逆序实现)/*LinkListq=L;for(inti=1;i<=n;i++){LinkListp=(LinkList)malloc(sizeof(Lnode));感谢阅读q->next=p;p->next=NULL;q=q->next;printf("请输入链表La中的第%d个元素:\n",i);精品文档放心下载scanf("%d",&p->data);}//(正序实现)*/}//初始化单链表//有序单链表La和Lb的归并voidMergeList_L(LinkList&La,LinkList&Lb,LinkList&Lc)谢谢阅读{LinkListpa=La->next;LinkListpb=Lb->next;LinkListpc;Lc=pc=La;while(pa&&pb){if(pa->data<=pb->data){!-pc->next=pa;pc=pa;pa=pa->next;精品文档放心下载}else{pc->next=pb;pc=pb;pb=pb->next; }感谢阅读}pc->next=pa?pa:pb;free(Lb);printf("ppppppppppppppp");谢谢阅读}//MergeList//输出单链表voidPrint_L(LinkListL){LinkListp;p=L->next;while(p){printf("%d ",p->data);p=p->next;}printf("\n");}3.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。)精品文档放心下载#include<stdio.h>#include<stdlib.h>#include<malloc.h>//定义存储结构typedef struct Lnode{intdata; /*每个元素数据信息*/structLnode*next; /*存放后继元素的地址*/精品文档放心下载}LNode,*LinkList;voidmain(){voidCreate_L(LinkList&L,intn);感谢阅读voidPrint_L(LinkListL);voidReverseList(LinkListL);谢谢阅读LinkListLa;//创建单链表La!-intn;printf("请输入链表La中的元素个数:\n");感谢阅读scanf("%d",&n);Create_L(La,n);//初始化单链表printf("现在La中的元素顺序为:\n");精品文档放心下载Print_L(La);printf("-------------------------------------\n\n");谢谢阅读ReverseList(La);printf("逆置后,La的元素顺序为:\n");感谢阅读Print_L(La);}voidCreate_L(LinkList&L,intn)谢谢阅读{intj=1;L=(LinkList)malloc(sizeof(Lnode));感谢阅读L->next=NULL;//先建立一个带头结点的单链线

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论