1. 数据结构与算法
#include<stdio.h>
swap(int*a,int*b,intn,intk)
{
inttemp,j;
for(temp=0,j=0;temp<n;temp++)
if(k<n)
*b++=a[k++];
else
*b++=a[j++];
}
intsearchValue(intB[],intvalue)
{
inti=0;
while(1)
if(value==B[i++]&&i<1000)
returni;
}
intmain()
{
inta[5]={1,2,3,4,5};intb[5];
inti;
swap(a,b,5,2);
for(i=0;i<5;i++)
printf("%d",a[i]);printf(" ");
for(i=0;i<5;i++)
printf("%d",b[i]);
i=searchValue(b,4);
printf(" %d",i);
getch();
}
2. 数据结构和算法有什么关系数据结构就是算法吗
首先你要弄清楚数据结构是什么?数据结构呢其实就是一种存储数据之间的逻辑结构:比如我们学过的线性结构:顺序表啦,链表啦;层次结构:树啦。合适的数据结构可以带来更高的运行效率和存储效率,与相应解决实际问题算法的适应性也就越高,这也就是为什么一些算法指定了数据存储必须以某种特定的数据结才行。一般都是根据合适的数据结构来设计算法,而不是根据算法来设计数据结构。
算法和数据结构往往是互不分开的。离开了算法,数据结构就显得毫无意义,而没有了数据结构算法就没有实现的条件。良好的数据结构思想就是一种高效的算法,但是数据结构不等于算法。只有当数据结构用于处理某个特定问题类型的时候,数据结构才会体现为算法。要想细致的了解,就要多看书,因为这东西毕竟发展了那么多年,一两句话是说不清楚的。想知道更多的数据结构与算法知识吗?可以去了解一下小码哥李明杰。
3. 数据结构与算法求助,答案是B,希望有过程,题目有图
从答案来分析的话,数组是一组变量,可以看作一组整数,游标可以看作指针,然后开始循环,那么队首和队尾指针是肯定不一样的
仅供参考
4. 数据结构与算法题目
#include<stdio.h>
intmain()
{inti,j,k,a[5]={5,8,9,12,16},b[9]={1,3,5,5,7,8,9,12,16},c[14];
for(i=j=k=0;i<5&&j<9;)
if(a[i]<b[j])c[k++]=a[i++];
elsec[k++]=b[j++];
for(;i<5;)c[k++]=a[i++];
for(;j<9;)c[k++]=b[j++];
for(k=0;k<14;k++)printf("%d",c[k]);
return0;
}
5. 数据结构与算法求助,答案是B,希望有过程,因为不懂过程怎么得来的,题目有图
这一题可以用特例法以及排除法,A选项有可能整个队列是空的。C选项有可能队头是1,队尾是2,n>2,队伍里面有可能只有一个元素。D选项与C类似,也是有可能队伍里面只有一个元素。
B选项是对的,也就是队尾的指针加上1,除以n取余,跟对头相等,也就是对队尾指针的下一个又到的队头,这就说明了队伍已经满了。
6. 数据结构与算法选择题
1.A
存取任一指定序号,用顺序表最方便,在最后进行插入和删除运算,顺序表也可以方便的实现。
2.C
第一个是5,第二个是4,都可以,表示5、4是最后进栈的,之后再要出栈1,不可能
3.D
4.C
5.A
生成树
6.D
二分查找的前提是该查找必须是顺序存储的有序表
7.C
8.不清楚
9.B
abc,cba正好倒过来。
10.B
7. 数据结构与算法 线性表A、B,分别由单链表LA,LB存储,其中数据元素按值升序排列
先建立一个链表c然后分别从链表a,b中弹出元素,每次取最小的加入链表,我的意思是如果x>y则将Y插入链表C直到出现Z>X才将x插入链表c,只需要编顺次弹出元素和比较大小,加入元素这三个子程序就行了
8. 什么是算法与数据结构
算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。
一个算法应该具有以下五个重要的特征:
1、有穷性: 一个算法必须保证执行有限步之后结束;
2、确切性: 算法的每一步骤必须有确切的定义;
3、输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;
4、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
5、可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
计算机科学家尼克劳斯-沃思曾着过一本着名的书《数据结构十算法= 程序》,可见算法在计算机科学界与计算机应用界的地位。
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。
在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。
选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。
在计算机科学中,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。
“数据结构”作为一门独立的课程在国外是从1968年才开始设立的。 1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所着的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的着作。“数据结构”在计算机科学中是一门综合性的专业基础课。数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。数据结构这一门课的内容不仅是一般程序设计(特别是非数值性程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。
计算机是一门研究用计算机进行信息表示和处理的科学。这里面涉及到两个问题:
信息的表示
信息的处理
而信息的表示和组又直接关系到处理信息的程序的效率。随着计算机的普及,信息量的增加,信息范围的拓宽,使许多系统程序和应用程序的规模很大,结构又相当复杂。因此,为了编写出一个“好”的程序,必须分析待处理的对象的特征及各对象之间存在的关系,这就是数据结构这门课所要研究的问题。众所周知,计算机的程序是对信息进行加工处理。在大多数情况下,这些信息并不是没有组织,信息(数据)之间往往具有重要的结构关系,这就是数据结构的内容。数据的结构,直接影响算法的选择和效率。
计算机解决一个具体问题时,大致需要经过下列几个步骤:首先要从具体问题中抽象出一个适当的数学模型,然后设计一个解此数学模型的算法(Algorithm),最后编出程序、进行测试、调整直至得到最终解答。寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述。计算机算法与数据的结构密切相关,算法无不依附于具体的数据结构,数据结构直接关系到算法的选择和效率。运算是由计算机来完成,这就要设计相应的插入、删除和修改的算法 。也就是说,数据结构还需要给出每种结构类型所定义的各种运算的算法。
数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。
数据元素是数据的基本单位,在计算机程序中通常作为一个整体考虑。一个数据元素由若干个数据项组成。数据项是数据的不可分割的最小单位。有两类数据元素:一类是不可分割的原子型数据元素,如:整数"5",字符 "N" 等;另一类是由多个款项构成的数据元素,其中每个款项被称为一个数据项。例如描述一个学生的信息的数据元素可由下列6个数据项组成。其中的出身日期又可以由三个数据项:"年"、"月"和"日"组成,则称"出身日期"为组合项,而其它不可分割的数据项为原子项。
关键字指的是能识别一个或多个数据元素的数据项。若能起唯一识别作用,则称之为 "主" 关键字,否则称之为 "次" 关键字。
数据对象是性质相同的数据元素的集合,是数据的一个子集。数据对象可以是有限的,也可以是无限的。
数据处理是指对数据进行查找、插入、删除、合并、排序、统计以及简单计算等的操作过程。在早期,计算机主要用于科学和工程计算,进入八十年代以后,计算机主要用于数据处理。据有关统计资料表明,现在计算机用于数据处理的时间比例达到80%以上,随着时间的推移和计算机应用的进一步普及,计算机用于数据处理的时间比例必将进一步增大。
数据结构是指同一数据元素类中各数据元素之间存在的关系。数据结构分别为逻辑结构、存储结构(物理结构)和数据的运算。数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构。逻辑结构形式地定义为(K,R)(或(D,S)),其中,K是数据元素的有限集,R是K上的关系的有限集。
数据元素相互之间的关系称为结构。有四类基本结构:集合、线性结构、树形结构、图状结构(网状结构)。树形结构和图形结构全称为非线性结构。集合结构中的数据元素除了同属于一种类型外,别无其它关系。线性结构中元素之间存在一对一关系,树形结构中元素之间存在一对多关系,图形结构中元素之间存在多对多关系。在图形结构中每个结点的前驱结点数和后续结点数可以任意多个。
数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。它包括数据元素的表示和关系的表示。数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。
数据结构中,逻辑上(逻辑结构:数据元素之间的逻辑关系)可以把数据结构分成线性结构和非线性结构。线性结构的顺序存储结构是一种随机存取的存储结构,线性表的链式存储结构是一种顺序存取的存储结构。线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。逻辑结构与数据元素本身的形式、内容、相对位置、所含结点个数都无关。
算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数据的运算是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新的排序等。
9. 问: [image]20 数据结构与算法 线性表A、B,分别由单链表LA,LB存储,其中数据元素按
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//类型定义
typedef char ElemType;
typedef struct Node
{ //结点类型
ElemType data; //数据域
struct Node *next; //指针域
}Node, *LinkList;
//函数声明
LinkList *Create (LinkList *L);//生成链表
LinkList UnionList(LinkList LA, LinkList LB, LinkList LC);//合并两个有序链表后仍有序
void ShowList(LinkList L);//输出单链表
void DestroyList(LinkList *L);//清除链表
void main()
{
LinkList *L1,*L2,*L3;
L1=(LinkList*)malloc(sizeof(LinkList));
L2=(LinkList*)malloc(sizeof(LinkList));
L3=(LinkList*)malloc(sizeof(LinkList));
L1=Create(L1);
ShowList(*L1);
L2=Create(L2);
ShowList(*L2);
*L3=UnionList(*L1,*L2,*L3);
ShowList(*L3);
DestroyList(L1);
free(L1);
free(L2);
free(L3);
}
LinkList *Create (LinkList *L)//建立一个单链表,将新结点插入表尾
{
Node *r, *s;
ElemType c;
int i,n;
*L = (LinkList) malloc (sizeof(Node)); //为头结点分配存储空间
r = *L; //r初值指向头结点
printf("请输入生成链表的结点数:");
scanf("%d",&n);getchar();//接收回车
for (i = 1; i <= n; i ++)
{
printf("请输入第%d个元素:",i);
c=getchar(); //获取一个数据元素
getchar();//接收回车
s = (LinkList) malloc (sizeof(Node)); //生成一个新结点
s -> data = c; //将要插入数据元素的值赋给新结点的数据域
s -> next = NULL; //链表末尾结点指针域为空
r -> next = s; //将新结点插入到当前链表的表尾上
r = s; //r始终指向链表的当前表尾
}
return L;
}
LinkList UnionList(LinkList LA, LinkList LB, LinkList LC)
{
Node *pa, *pb,*pc;
pa=LA->next;
pb=LB->next;
pc=LA;LC=pc;//也可以写成LC=pc=LA;
while((pa!=NULL)&&(pb!=NULL))
{
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);LB=NULL;
return LC;
}
void ShowList(LinkList L)
{
Node *p;
p=L->next;
if(p!=NULL)
do
{printf("%3c",p->data);
p=p->next;
} while(p!=NULL);
else printf("空链表 ");
printf(" ");
}
void DestroyList(LinkList *L)
{
Node *p;
if(*L==NULL){ free(L);return ;}
else
{
p=*L;
while(*L!=NULL)
{
p=*L;
*L=(*L)->next;
free(p);
}
}
printf("链表已清除! ");
}