1. 数据结构(c语言版)和数据结构区别
C语言是一种编程的语言,编程的语言有很多种。
而数据结构则是讲的是关于一些数据的理论知识。
可以说不管什么编程语言都能用到数据结构的知识,数据结构是程序设计基础又核心的知识。
可以将c语言想象为一种语言,那么数据结构就是一种说话的技巧,如何让你说话更简洁,有逻辑,容易让人听懂,这表达技巧不管你用中文或者ENGLISH都可以用上。
当然,如果你想成为一个优秀的程序设计人员,数据结构是必须掌握好的
2. c语言数据结构?
解答如图所示,学习过程中要多动手画图,每一步哪个指针指向哪,执行完后链表变成什么样子自己动手画画有助于理解,有不明地方可以追问,祝学习愉快~
3. java中都有哪些数据结构??
数据结构:
①数组 (Array)
在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数
据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组
元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指
针数组、结构数组等各种类别。
②栈 (Stack)
栈是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后
的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
③队列 (Queue)
一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行
插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
④链表 (Linked List)
一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:
一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
⑤树 (Tree)
树是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:
(1)有且仅有一个结点 k0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根(root)
(2)除K0外,k中的每个结点,对于关系N来说有且仅有一个前驱。
(3)K中各结点,对关系N来说可以有m个后继(m>=0)。
⑥堆 (Heap)
在计算机科学中,堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指
二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
⑦图 (Graph)
图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,
边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
⑧散列表 (Hash)
若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称
这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。
差不多我就知道这些了~
4. java数据结构
首先明确,带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树
那么比如说有4个节点,分别带权7,5,2,4如下ab两图
WPLa=7*2+5*2+2*2+4*2=36
WPLb=7*1+5*2+2*3+4*3=35
可以看到,出现概率越小的越应该放在下面(也就是说被遍历的概率小就可以代价大一点,而容易便利到的一定要减少开销)
其实是有一套算法的...从底往上,找最小的两个节点做和,做和得到的新结点和未被计算的节点重复“最小两节点做和”操作 最终结果:
WPL=30*2+5*5*4+8*4*15*3+15*2+27*2=
不算了 口算不行... 看上式也知道你出现的概率越大,相当于基地越大,就给你乘个小的代价,必然是最优的。
5. java中有哪些数据结构
数据结构:
①数组 (Array)
在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数
据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组
元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指
针数组、结构数组等各种类别。
②栈 (Stack)
栈是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后
的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
③队列 (Queue)
一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行
插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
④链表 (Linked List)
一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:
一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
⑤树 (Tree)
树是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:
(1)有且仅有一个结点 k0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根(root)
(2)除K0外,k中的每个结点,对于关系N来说有且仅有一个前驱。
(3)K中各结点,对关系N来说可以有m个后继(m>=0)。
⑥堆 (Heap)
在计算机科学中,堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指
二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
⑦图 (Graph)
图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,
边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
⑧散列表 (Hash)
若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称
这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。
差不多我就知道这些了~
6. c语言版的数据结构和c++版的数据结构有什么不同
C语言和C++描述数据结构最大的区别在于设置思想,C语言是一种结构化程序设计语言,而C++是一种面向对象的程序设计语言,它两者的区别主要在于数据和操作的关系。
C语言是定义数据类型,数据类型定义变量,然后函数操作变量,换句话说C语言是“操作的数据”。
C++是定义类,类本身就具备操作,换句话说,C++是“数据的操作”。
7. 数据结构算法与c语言的关系?
C语言是工具,数据结构是基础,算法是核心且有难有易,初级的编程只要懂编程语言和一般算法即可,至于数据结构可作一般了解;中级的编程要对数据结构和算法有深入的理解和掌握;高级的编程就需要完全理解各种数据结构以及自己编写算法了!不过现在的很多程序员都是在中级阶段的居多吧!
8. 数据结构 C语言
你这题目要求不明确。
我尽量把所有可能功能写进去。
1、输入分自动输入和手动输入两种模式,都是生成单链表。手动有输入验证
2、输入大写字母按顺序添加到链表,我写了2中排列(1、按ascii码排列。2、按字母顺序排列)
#include #include typedef struct abc{ char c; struct abc *next;}ABC;void MeError(ABC *lets);//内存申请异常ABC *add2Lits(ABC *abcHead,ABC *abcTail,char c);//向链表添加字母ABC *deleteByInx(ABC *abcHead,ABC *abcTail,int inx);//删除指定位置,返回尾节点,参数inx:第几个节点ABC *insert2List(ABC *abcHead,ABC *abcTail,char c,int x);//向链表顺序位置插入大写字母(x=1按照ASCII码顺序插入,x=0按照字母顺序插入)ABC *inputLet(ABC *abcHead,ABC *abcTail,int flag);//顺序输入26个小写字母void printfList();//打印链表int maxlen=26;//链表总长度int main(){ int i; char c; ABC *abcHead=NULL,*abcTail=NULL; abcHead=(ABC *)malloc(sizeof(ABC)); MeError(abcHead); abcHead->next=NULL; printf("1、自动录入小写字母输入0,手动录入输入1:"); scanf("%d",&i); abcTail=inputLet(abcHead,abcTail,i); printfList(abcHead); printf("\n2、请输入要删除第几个字母:"); scanf("%d",&i); abcTail=deleteByInx(abcHead,abcTail,i); printfList(abcHead); printf("\n3、请输入要插入的大写字母:"); getchar(); scanf("%c",&c); getchar(); printf("--按ASCII码顺序插入输入1,按照字母顺序插入输入0:"); scanf("%d",&i); abcTail=insert2List(abcHead,abcTail,c,i); printfList(abcHead); return 0;}void printfList(ABC *abcHead)//打印链表{ printf("打印链表内容:\n"); while(abcHead->next!=NULL) { printf("%c ",abcHead->next->c); abcHead=abcHead->next; } printf("\n");}ABC *inputLet(ABC *abcHead,ABC *abcTail,int flag)//顺序输入26个小写字母,参数flag>0:手动输入,flag=0自动输入{ int i=maxlen; char lc=0,c; if(!flag) { printf("--按照顺序自动输入26个小写字母......\n"); c='a'; while(i--) abcTail=add2Lits(abcHead,abcTail,c++); return abcTail; } printf("--按照顺序输入26个小写字母......\n"); getchar(); while(i--) { printf("输入第%d个字母:",26-i); scanf("%c",&c); getchar(); if((lc==0 && c!='a')||(lc!=0 && c-lc!=1)) { printf("错误!请按照小写字母顺序重新"); i++; continue; } else { lc=c; abcTail=add2Lits(abcHead,abcTail,c); } } return abcTail;}void MeError(ABC *lets)//内存申请异常{ if(!lets) { printf("内存申请失败!\n"); exit(0); }}ABC *add2Lits(ABC *abcHead,ABC *abcTail,char c)//向链表添加字符,返回尾节点{ ABC * abcNew=(ABC *)malloc(sizeof(ABC)); MeError(abcNew); abcNew->c=c; abcNew->next=NULL; if(abcHead->next==NULL) abcHead->next=abcNew; else abcTail->next=abcNew; abcTail=abcNew; return abcTail;}ABC *deleteByInx(ABC *abcHead,ABC *abcTail,int inx)//删除指定位置,返回尾节点,参数inx:第几个节点{ int i=0,flag=0; ABC *abcNext=NULL;//要删除的节点的后一个节点 while(abcHead->next!=NULL) { i++; abcNext=abcHead->next->next; if(i==inx) { if(abcHead->next==abcTail) abcTail=abcHead; free(abcHead->next); abcHead->next=abcNext; flag=1; maxlen--; break; } abcHead=abcHead->next; } if(flag==0) printf("未找到指定的字母\n"); return abcTail;}ABC *insert2List(ABC *abcHead,ABC *abcTail,char c,int x)//向链表顺序位置插入大写字母(x=1按照ASCII码顺序插入,x=0按照字母顺序插入){ ABC *abcNext=NULL,*abcNew=NULL; abcNew=(ABC *)malloc(sizeof(ABC)); abcNew->c=c; abcNew->next=NULL; while(abcHead->next!=NULL) { abcNext=abcHead->next->next; if((x==1 && (abcNext==NULL || cnext->c))||(x==0 && (abcNext==NULL || c+32next->c))) { abcNew->next=abcHead->next; abcHead->next=abcNew; break; } abcHead=abcHead->next; } return abcTail;}