实验二链表的建立和基本运算.docx

上传人:b****5 文档编号:5724327 上传时间:2022-12-31 格式:DOCX 页数:10 大小:17.76KB
下载 相关 举报
实验二链表的建立和基本运算.docx_第1页
第1页 / 共10页
实验二链表的建立和基本运算.docx_第2页
第2页 / 共10页
实验二链表的建立和基本运算.docx_第3页
第3页 / 共10页
实验二链表的建立和基本运算.docx_第4页
第4页 / 共10页
实验二链表的建立和基本运算.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

实验二链表的建立和基本运算.docx

《实验二链表的建立和基本运算.docx》由会员分享,可在线阅读,更多相关《实验二链表的建立和基本运算.docx(10页珍藏版)》请在冰豆网上搜索。

实验二链表的建立和基本运算.docx

实验二链表的建立和基本运算

实验二链表的建立和基本运算

一、实验目的

1、掌握链表存储结构的定义及C/C++语言实现

2、掌握双链表的特点和基本运算及C/C++语言实现

3、建立并正反序显示双链表结点数据,并执行结点插入操作

Forpersonaluseonlyinstudyandresearch;notforcommercialuse

二、实验环境

PC微机,Windows,DOS,TurboC或VisualC++

三、实验内容

Forpersonaluseonlyinstudyandresearch;notforcommercialuse

1、实现链表的运算

(1)问题描述

链表经常进行的运算操作有创建链表、求链表的长度、在链表中查找某个数据元素、在某个位置插入一个新数据元素、在链表中删除某个数据元素等操作。

试编程实现链表的这些基本运算。

Forpersonaluseonlyinstudyandresearch;notforcommercialuse

(2)基本要求

实现链表的每个运算要求用一个函数实现。

(3)算法描述

在设计链表的各种运算之前,最重要的准备工作是定义链式存储(即链表)的结点类型,最简单的链表的结点类型可由数据域data和指针域next两部分组成。

然后再分别设计各种运算的具体函数。

最后在主函数中实现链表的各种运算时,分别调用相应的函数即可。

首先,在主函数中创建一个包含若干个结点的链表,在此基础上,就可以调用插入函数在链表的某个位置插入结点,调用求长度函数求出链表的长度,当然其他运算依次类推。

为方便地实现上述的个种基本运算,可以再设计一个操作方便的主菜单。

在整个算法中有一个贯穿各个运算函数之间的线索,那就是链表。

因此各个函数中的运算对象都是针对同一个链表的。

为了参数的传递方便,可以把指向链表的表头指针设定为全局变量。

(4)算法实现——示例程序

#include"stdafx.h"

#include//malloc()等

#include//NULL,printf()等

#include//exit()

#definenull0;

typedefintElemType;

typedefstructnode

{

ElemTypedata;/*数据域*/

structnode*next;/*指针域*/

}Lnode;

/*定义基本线性表的结点结构*/

Lnode*head;/*定义基本线性表的表头指针为全局变量*/

intlength(Lnode*p)/*求指针p指向的基本线性表的长度*/

{

intn=0;/*结点位置计数器*/

Lnode*q=p;/*定义临时指针q*/

while(q)/*当基本线性表不空时,统计基本线性表中的结点数*/

{

n++;

q=q->next;

}

return(n);/*返回统计的结点数*/

}

ElemTypeget(Lnode*p,inti)

/*求指针p指向的基本线性表中第i个结点的值*/

{

intj=1;/*查找结点位置的计数器*/

Lnode*q=p;/*定义临时指针q*/

while(j

{

q=q->next;

j++;

}

if(q)/*如果存在,返回其数据域的值*/

return(q->data);

else/*否则,输出其位置参数不正确*/

printf("位置参数不正确!

\n");

}

intLocate(Lnode*p,ElemTypex)

/*求指针p指向的基本线性表中的数据元素X的位置序号*/

{

intn=0;/*结点位置计数器*/

Lnode*q=p;/*定义临时指针q*/

while(q&&q->data!

=x)

/*在基本线性表中查找数据元素x的位置*/

{q=q->next;

n++;

}

if(q)/*如果不存在,则返回-1*/

return(-1);

else/*否则,返回结点的位置序号*/

return(n+1);

}

voidinsert(ElemTypex,inti)

/*在基本线性表的的位置i,插入数据元素*/

{

intj=1;/*结点位置计数器*/

Lnode*s,*q;/*定义临时指针s,q*/

s=(Lnode*)malloc(sizeof(Lnode));/*生成新结点*/

s->data=x;/*将新结点的数据域置为x*/

q=head;

if(i==1)/*如果插入位置是1,则将新结点插入到表头*/

{

s->next=q;

head=s;

}

else/*否则,查找插入位置*/

{

while((jnext))

{

q=q->next;

j++;

}

if(j==i-1)

{

s->next=q->next;

q->next=s;

}

else/*插入位置不存在*/

printf("位置参数不正确!

\n");

}

}

voiddeletex(Lnode*p,inti)

/*将指针p指向的基本线性表中的位置i的数据元素删除*/

{

intj=1;/*结点位置计数器*/

Lnode*q=p,*t;

if(i==1)

/*如果位置序号为1,则将基本线性表的第1个数据元素结点删除*/

{

t=q;

p=q->next;

}

else/*否则,从表头查找相应的位置序号i*/

{

while((jnext))

{

q=q->next;

j++;

}

if(q->next&&j==i-1)

/*如果找到位置i,则将该位置的结点删除*/

{

t=q->next;

q->next=t->next;

}

else/*否则位置i不存在*/

printf("位置参数不正确!

\n");

}

if(t)

free(t);

}

voiddisplay(Lnode*p)

{

Lnode*q;

q=p;

printf("单链表显示:

");

if(q)

printf("链表为空");

elseif(q->next)

printf("%d\n",q->data);

else

{

while(q->next)

{

printf("%d->\n",q->data);

q=q->next;

}

printf("%d\n",q->data);

}

printf("\n");

}

voidmain()

{

Lnode*q;

intd,i,n,select,k,flag=1;

head=null;

printf("请输入数据长度:

");

scanf("%d",&n);

for(i=1;i<=n;i++)

{

printf("将数据到插入到链表中:

");

scanf("%d",&n);

insert(d,i);

}

display(head);

printf("\n");

while(flag)

{

printf("1---------求长度\n");

printf("2---------取结点\n");

printf("3-------求值查找\n");

printf("4--------增加结点\n");

printf("5--------删除结点\n");

printf("6--------退出\n");

printf("inputyourselect:

");

scanf("%d",&select);

switch(select)

{

case1:

{

d=length(head);

printf("\n单链表的长度为:

%d",d);

printf("\n");

display(head);

printf("\n");

}

break;

case2:

{

printf("\n请输入取得结点的位置:

");

scanf("%d",&d);

k=get(head,d);

printf("%d\n",k);

display(head);

printf("\n");

}

break;

case3:

{

printf("\n请输入要查找的数据:

");

scanf("%d",&d);

k=Locate(head,d);

printf("%d\n",k);

display(head);

printf("\n");

}

break;

case4:

{

printf("\n请输入增加结点的位置:

");

scanf("%d",&k);

printf("\n请输入增加结点的数据:

");

scanf("%d",&d);

insert(d,k);

display(head);

printf("\n");

}

break;

case5:

{

printf("\n请输入删除结点的位置:

");

scanf("%d",&d);

deletex(head,d);

printf("\n");

display(head);

printf("\n");

}

break;

case6:

flag=0;

break;

}

}

}

2、求集合的并、交和差集

(1)问题描述

求出任意两个正整数集合的的交、并和差集。

(2)基本要求

程序运行后显现提示信息,由用户输入两组整数分别作为两个集合的元素。

程序将自动滤去由程序计算它们的交、并和差集,并将运算结果输出。

3、火车票销售

(1)问题描述

试编制一个简单的火车票销售系统,可完成售票、退票、车票剩余情况查询等功能。

每张车票包含车次、座位信息。

(2)基本要求

在售票、退票、查询剩余票等环节中,都必须显示出车票的信息,即车次、座位情况。

为简单起见,在此假设所有出售的车票均为同一车次的车票。

退票时,必须是车站售出的列车票才能退,否则视为无效票,不能办理退票业务。

四、实验要求

1、认真阅读和掌握、上机调试并运行实验内容1的程序;保存和打印出程序的运行结果,并结合程序进行分析。

2、用C/C++完成实验内容2、3的算法设计和程序设计并上机调试通过。

要求:

(1)给出程序设计的基本思想、原理和算法描述。

(2)对源程序给出注释。

(3)保存和打印出程序的运行结果,并结合程序进行分析。

3、撰写实验报告,提供实验结果和数据。

仅供个人用于学习、研究;不得用于商业用途。

Forpersonaluseonlyinstudyandresearch;notforcommercialuse.

NurfürdenpersönlichenfürStudien,Forschung,zukommerziellenZweckenverwendetwerden.

Pourl'étudeetlarechercheuniquementàdesfinspersonnelles;pasàdesfinscommerciales.

 толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях. 

以下无正文

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1