当前位置:文档之家› 实验报告1

实验报告1

实验一创建链表和链表操作一、实验目的掌握线性表的基本操作:插入、删除、查找、以及线性表合并等操作在顺序存储结构和链式存储结构上的实现。

二、实验内容:1. 创建单链表2.在链表上进行插入、删除操作;3.设计一个程序,用两个单链表分别表示两个集合,并求出这两个集合的并集。

四、测试数据:∙(3,9,5,6,11,8);在5之前插入4,7,并删除11∙求集合{1,12,8,6,4,9}和{2,5,12,7,4}的并集五、概要设计:本操作应完成如下功能:(1)创建链表说明:分配一定的空间,根据给定的链表长度输入值,创建链表。

(2)合并链表说明:将两个链表合并为一个链表只需修改链表头、尾指针即可实现。

(3)在链表中插入值说明:将给定的值插入到指定位置上,只需修改插入位置的前后结点的指针即可。

(4)在链表中删除值说明:将指定位置的值删除,只需修改删除位置的前后结点的指针即可。

六、详细设计:源代码:#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<iostream.h>#define OK 1#define ERROR 0#define OVERFLOW 0//线性链表的存储结构,一个结点typedef struct LNode{int data; // 数据域struct LNode *next; // 指针域}LNode,*LinkList; //结点结构类型和指向结点的指针类型int TraverseList_L(LinkList L) //遍历单链表{LinkList p;p=L->next;while(p){printf("-->%d",p->data);p=p->next;}return OK;}//尾插法创建的带头结点的单链表。

void CreateList_L(LinkList &L,int &n){L=(LinkList)malloc(sizeof (LNode));//建立一个空链表L。

if(!L){exit(OVERFLOW);}elseL->next=NULL;int i=0;LinkList p,q;printf("请输入要在该链表存放的值");q=L;for(i=0;i<n;i++){p=(LinkList)malloc(sizeof (LNode));//生成新结点。

scanf("%d",&p->data);p->next=q->next;q->next=p;q=p;}}LinkList MergeList_L(LinkList &LA,LinkList &LB)//合并LA和LB链表为LC。

{LNode *p,*q;p=LA;while(p->next!=NULL) p=p->next;//p指向尾结点q=LB->next;p->next=q;free(LB);return(LA);}//在第i个元素插入一个元素e。

LinkList ListInsert_L(LinkList &L,int i,int e){LNode *p,*s;int j;printf("请输入要插入的结点位置:");scanf("%d",&i);p=L;j=0;while(p&&j<i-1){p=p->next;++j;} //寻找第i-1个结点。

if(!p||j>i-1){printf("您插入的位置不合法,不合法");return 0;} //判断i的值是否合法s=(LinkList)malloc(sizeof(LNode));if(!s) exit(OVERFLOW);printf("请输入要在该结点存放的数值:");scanf("%d",&e);s->data=e;s->next=p->next;p->next=s;return(L);}//删除结点LinkList ListDelete_L(LinkList &L,int i,int e){LNode *p,*q;p=L;int j=0;printf("请输入要删除的结点的位置:");scanf("%d",&i);while(p->next && j<i-1)//寻找结点,并令p返回其前驱。

{p=p->next;++j;}if(!(p->next)||j>i-1){printf("您删除的位置不合法,不合法");return 0;}q=p->next;p->next=q->next;e=q->data;}//主函数。

void main(){int n,i,e,m,j;LinkList L,LA,LB,LC,LLL;LNode *MergeList;printf("请输入要定义的LA链表长度:");//输入链表LA值。

scanf("%d",&n);CreateList_L(LA, n);printf("LA链表输出为:");TraverseList_L(LA);printf("\n");printf("请输入要定义的LB链表长度:");//输入链表LB的值。

scanf("%d",&n);CreateList_L(LB, n);printf("LB链表输出为:");TraverseList_L(LB);printf("\n");system("CLS");printf("LA链表输出为:");TraverseList_L(LA);printf("\n");printf("LB链表输出为:");TraverseList_L(LB);printf("\n");printf("LA和LB合并后LC链表输出为:");//输出LCMergeList_L(LA,LB);TraverseList_L(LA);printf("\n");sub:printf("***************************************************************");p rintf("\n");printf(" 按数字 1.插入结点");printf("\n");printf(" 按数字 2.删除结点");printf("\n");printf(" 按除数字(1-2)外任意键退出");printf("\n");printf("************************************************************** *");printf("\n");printf("请选择数字进行操作:");scanf("%d",&m);printf("\n");switch(m){case 1: ListInsert_L(LA,i,e);//插入结点。

printf("插入后的链表为:");TraverseList_L(LA);printf("\n\n\n");goto sub;case 2: ListDelete_L(LA,i,e); //删除结点。

printf("删除后的链表为:");TraverseList_L(LA);printf("\n\n\n");goto sub;default: break;}}七:测试结果:如下图,为链表的创建:如下图,为链表的合并:如下图,为结点的插入:如下图,为结点的删除:八、实验心得:这是在继我们学习了C的基础上开设的一门课程,C的编码语言是我们学习数据结构的基础,因此要时常温习C中的有关知识。

相较于C的代码语言,数据结构更注重编程的思想,它是一种描述算法语言的课程,在这里算法和联想以及抽像的思维是必要的。

对于一个程序来说一个程序=算法+数据结构,可见数据结构的重要性,因此在这次程序设计的学习中,我努力学习了有关链表的各种算法和具体操作。

数据结构的选择是一个基本的设计考虑因素。

系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。

许多时候,确定了数据结构后,算法就容易得到了。

有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。

不论哪种情况,选择合适的数据结构都是非常重要的。

选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。

学习了数据结构让我明白了算法是整个程序的基础和灵魂,只有清楚地搞懂一个算法,才能明白整个程序所要达到的目的是什么。

一个好的算法可以将操作变得简单且开销较小。

链表是C中比较简便的一种操作,它可以在时间和空间耗费较小的情况下对排序、删除、加入、查询等进行更为方便的操作,链表虽简单,但是它的功能还是很齐全的。

尤其是在各种运算中着重指针的修改和应用,这里指针是很灵活的在计算机科学中,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。

在这个简单的程序中我们按照老师的要求初步达到了该程序的设计目的,虽然设计时间很是短暂,但我觉得自己学到了很多宝贵的经验,对数据结构有了更多新的认识和看法。

程序的代码需要反复进行调试才能达到理想的效果,这个过程是非常繁琐的,所以需要我们有足够的耐心和细心,相信我们经过一次课程,不仅知识有所提升,而且态度也要有所端正,总之这次数据库课程设计让我受益颇多。

相关主题