数据结构实验报告 实验一 线性表链式存储运算的算法实现

  • 格式:doc
  • 大小:71.50 KB
  • 文档页数:3

下载文档原格式

  / 3
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

昆明理工大学信息工程与自动化学院学生实验报告

(201 —201 学年第一学期)

课程名称:数据结构开课实验室:年月日

一.实验内容:

线性表链式存储运算的算法实现,实现链表的建立、链表的数据插入、链表的数据删除、链表的数据输出。

二.实验目的:

1.掌握线性表链式存储结构的C语言描述及运算算法的实现;

2.分析算法的空间复杂度和插入和删除的时间复杂度;

3.总结比较线性表顺序存储存储与链式存储的各自特点。

三.主要程序代码分析:

LinkList creatListR1() //用尾插入法建立带头结点的单链表

{

char *ch=new char();

LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点*head

ListNode *s,*r,*pp;

r=head; //尾指针初值指向头结点

r->next=NULL;

scanf("%s",ch); //读入第一个结点的值

while(strcmp(ch,"#")!=0) { //输入#结束

pp=LocateNode(head,ch);

if(pp==NULL) {

s=(ListNode *)malloc(sizeof(ListNode)); //生成新的结点*s strcpy(s->data,ch);

r->next=s; //新结点插入表尾 r=s; //尾指针r指向新的表尾 r->next=NULL;

}

scanf("%s",ch); //读入下一个结点的值

}

return head; //返回表头指针

}

int Insert(ListNode *head) //链表的插入

{

ListNode *in,*p,*q;

int wh;

in=(ListNode *)malloc(sizeof(ListNode));in->next=NULL; //生成新结点p=(ListNode *)malloc(sizeof(ListNode));p->next=NULL;

q=(ListNode *)malloc(sizeof(ListNode));q->next=NULL;

scanf("%s",in->data); //输入插入的数据

scanf("%d",&wh); //输入插入数据的位置

for(p=head;wh>0;p=p->next,wh--);

q=p->next;

p->next=in;

in->next=q;

}

void DeleteList(LinkList head,char *key) //链表的删除

{

ListNode *p,*r,*q=head;

p=LocateNode(head,key); //按key值查找结点的

if(p==NULL)

exit(0); //若没有找到结点,退出

while(q->next!=p) //p为要删除的结点,q为p的前结点q=q->next;

r=q->next;

q->next=r->next;

free(r); //释放结点*r

}

四.程序运行结果:

五.实验总结:

通过线性表链式存储运算的算法实现的上机实验,我了解了链式的基本原理和方法,能编程对数据进行链式存储。由于顺序储存是用物理位置上的邻接关系来表示结点间的逻辑关系,其插入或删除运算不方便,而且当表长变化较大时,难以确定合适的存储规模,为了解决这些问题,我们采用链接方式存储线性表。所以,当线性表的长度变化较大,难以估计其存储规模时,以采用动态链表作为存储结构为好;如果对于频繁进行插入删除的线性表,以采用链表做存储结构。链接存储是最常用的存储方法之一,它不仅可以表示线性表,还可以用来表示各种非线性的数据结构。