摘要:前面所讲的栈是一种后进先出的数据结构,而在实际问题中还经常使用一种“先进先出” (FIFO---First In First Out)的数据结构:即插入在表一端进行,而删除在表的另一端进行,我们将这种数据结构称为队或队列,把允许插入的一端叫队尾(rear) ,把允许删除的一端叫队头(front)。如...
阅读全文
摘要:Working with StringsSo far, you’ve learned that you can create string objects in a variety of ways, display thecontents of a string object, read data ...
阅读全文
摘要:Constructing a StringTable 16.1 string Class ConstructorsConstructorDescription(#1) string(const char * s) Initializes a string object to the NBTS p...
阅读全文
摘要:由于栈的“后进先出”特点,在很多实际问题中都利用栈做一个辅助的数据结构来进行求解,下面通过几个例子进行说明。例3.1 简单应用:数制转换问题将十进制数N 转换为r 进制的数,其转换方法利用辗转相除法:以N=3467,r=8 为例,转换方法如下:所以:(3467)10 =(6613)8我们看到所转换的...
阅读全文
摘要:由于栈是运算受限的线性表,因此线性表的存储结构对栈也是适用的,只是操作不同而已。1. 顺序栈利用顺序存储方式实现的栈称为顺序栈。类似于顺序表的定义,栈中的数据元素用一个预设的足够长度的一维数组来实现:datatype data[MAXSIZE],栈底位置可以设置在数组的任一个端点,而栈顶是随着插入和...
阅读全文
摘要:栈和队列是在软件设计中常用的两种数据结构,它们的逻辑结构和线性表相同。其特点在于运算受到了限制:栈按“后进先出”的规则进行操作,队列按“先进先出”的规则进行操作,故称运算受限制的线性表。栈是限制在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。当表中没有元素时称...
阅读全文
摘要:在本章介绍了线性表的逻辑结构及它的两种存储结构:顺序表和链表。通过对它们的讨论可知它们各有优缺点,顺序存储有三个优点:(1) 方法简单,各种高级语言中都有数组,容易实现。(2) 不用为表示结点间的逻辑关系而增加额外的存储开销。(3) 顺序表具有按元素序号随机访问的特点。但它也有两个缺点:(1) 在顺...
阅读全文
摘要:例2.5 已知单链表H,写一算法将其倒置。即实现如图2.22的操作。(a)为倒置前,(b)为倒置后。算法思路:依次取原链表中的每个结点,将其作为第一个结点插入到新链表中去,指针p用来指向当前结点,p为空时结束。算法如下: 1 void reverse (Linklist H) 2 { 3 ...
阅读全文
摘要:下面先请看图2.22 ,在图2.22中,规模较大的结构数组sd[MAXSIZE] 中有两个链表:其中链表SL是一个带头结点的单链表,表示了线性表(a1, a2, a3, a4, a5),而另一个单链表AV是将当前sd 中的空结点组成的链表。 数组sd的定义如下:1 #define MAXSIZE …...
阅读全文
摘要:以上讨论的单链表的结点中只有一个指向其后继结点的指针域next,因此若已知某结点的指针为p,其后继结点的指针则为p->next ,而找其前驱则只能从该链表的头指针开始,顺着各结点的next 域进行,也就是说找后继的时间性能是O(1),找前驱的时间性能是O(n),如果也希望找前驱的时间性能达到O(1)...
阅读全文
摘要:对于单链表而言,最后一个结点的指针域是空指针,如果将该链表头指针置入该指针域,则使得链表头尾结点相连,就构成了单循环链表。如图2.16 所示。在单循环链表上的操作基本上与非循环链表相同,只是将原来判断指针是否为NULL变为是否是头指针而已,没有其它较大的变化。对于单链表只能从头结点开始遍历整个链表,...
阅读全文
摘要:1. 建立单链表(1)在链表的头部插入结点建立单链表链表与顺序表不同,它是一种动态管理的存储结构,链表中的每个结点占用的存储空间不是预先分配,而是运行时系统根据需求而生成的,因此建立单链表从空表开始,每读入一个数据元素则申请一个结点,然后插在链表的头部,如图2.10 展现了线性表:(25,45,18...
阅读全文
摘要:readelf readelf -a a.out 用于显示elf格式文件的信息。 -a是显示全部信息。
阅读全文
摘要:hexdump该命令是Linux下的打印16进制的利器,它可以按我们指定的格式输出16进制。-C 输出十六进制和对应字符如:hexdump -C a.out会将a.out以十六进制的形式打印出来
阅读全文
摘要:file simple.c查看文件的详细信息(会显示:simple.c: C source, ASCII text)
阅读全文
摘要:gcc -S simple.c把文件simple.c编译成汇编代码simple.s,simple.s可以用vi simple.s查看。
阅读全文
摘要:catcatfilename一次显示整个文件例如:cat simple.c
阅读全文
摘要:objcopy将目标文件的一部分或者全部内容拷贝到另外一个目标文件中,或者实现目标文件的格式转换。[描述]objcopy工具使用BFD库读写目标文件,它可以将一个目标文件的内容拷贝到另外一个目标文件当中。objcopy通过它的选项来控制其不同的动作,它可以将目标文件拷贝成和原来的文件不一样的格式。o...
阅读全文
摘要:ls -l该ls命令选项可以列出文件的详细信息(包括大小和读写权限等)。
阅读全文
摘要:所谓模块化编程,就是指一个程序包含多个源文件(.c 文件和 .h 文件),每个 .c 文件可以被称为一个模块。本章将会带你了解多文件编程,教你学会如果有效的组织各个文件,如何将各个文件联系起来。1. C语言多文件编译、链接的原理在讲解extern和static关键字的时候,我们已经给出了几个简单的多...
阅读全文
摘要:5. C语言变量的存储类别和生存期我们知道,变量是有数据类型的,用以说明它占用多大的内存空间,可以进行什么样的操作。除了数据类型,变量还有一个属性,称为“存储类别”。存储类别就是数据在内存中的存放区域。一个正在运行的C程序的内存空间可以分为五个区域:程序代码区、静态数据区、堆区、栈区和命令行参数区,...
阅读全文
摘要:动态内存分配也就是在程序运行中实时申请内存分配。这有利于我们对任意多的数据进行处理。如果这些数据不用了,我们也可以随时释放。变量有4种存储类别:auto(自动)、register(寄存器)、static(静态)和extern(外部)。1. C语言动态内存分配的概念前面的代码中,不管我们定义变量、函数...
阅读全文
摘要:1.对C语言输入输出流的深入理解流(stream)是一个很抽象的概念,《C程序设计语言》中这样定义:流与磁盘或其它外围设备关联的数据的源或目的地。在Unix/Linux中,文本流和二进制流是相同的,但在Windows中,稍有差异,所以C标准库提供了这两种类型的流。文本流是由文本行组成的序列,每一行包...
阅读全文
摘要:本章主要讲述:操作系统的概念、特征、功能和提供的服务操作系统的发展与分类操作系统的运行环境(内核态与用户态;中断、异常;系统调用)操作系统体系结构本章内容:第一节 操作系统的基本概念计算机系统自下而上可粗分为四个部分:硬件、操作系统、应用程序和用户(这里的划分与计算机组成原理的分层不同)。操作系统管...
阅读全文
摘要:由于顺序表的存贮特点是用物理上的相邻实现了逻辑上的相邻,它要求用连续的存储单元顺序存储线性表中各元素,因此,对顺序表插入、删除时需要通过移动数据元素来实现,影响了运行效率。本节介绍线性表链式存储结构,它不需要用地址连续的存储单元来实现,因为它不要求逻辑上相邻的两个数据元素物理上也相邻,它是通过“链”...
阅读全文
摘要:线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称其为顺序表。因为内存中的地址空间是线性的,因此,用物理上的相邻实现数据元素之间的逻辑相邻关系是既简单,又自然的。如图2.1 所示。设a1的存储地址为Loc(a1),每个数据元素占d个存储地址,则第...
阅读全文
摘要:线性表是最简单、最基本、也是最常用的一种线性结构。它有两种存储方法:顺序存储和链式存储,它的主要基本操作是插入、删除和检索等。2.1.1 线性表的定义线性表是一种线性结构。线性结构的特点是数据元素之间是一种线性关系,数据元素“一个接一个的排列”。在一个线性表中数据元素的类型是相同的,或者说线性表是由...
阅读全文
摘要:算法与数据结构的关系紧密,在算法设计时先要确定相应的数据结构,而在讨论某一种数据结构时也必然会涉及相应的算法。下面就从算法特性、算法描述、算法性能分析与度量等三个方面对算法进行介绍。1.3.1 算法特性 算法(Algorithm)是对特定问题求解步骤的一种描述,是指令的有限序列。其中每一条指令表示一...
阅读全文
摘要:1.2.1 数据类型 数据类型是和数据结构密切相关的一个概念。它最早出现在高级程序设计语言中,用以刻画程序中操作对象的特性。在用高级语言编写的程序中,每个变量、常量或表达式都有一个它所属的确定的数据类型。类型显式地或隐含地规定了在程序执行期间变量或表达式所有可能的取值范围,以及在这些值上允许进行的操...
阅读全文
摘要:数据结构与数学、计算机硬件和软件有十分密切的关系。数据结构是介于数学、计算机硬件和计算机软件之间的一门计算机科学与技术专业的核心课程,是高级程序设计语言、编译原理、操作系统、数据库、人工智能等课程的基础。同时,数据结构技术也广泛应用于信息科学、系统工程、应用数学以及各种工程技术领域。数据结构课程集中...
阅读全文
摘要:在系统地学习数据结构知识之前,先对一些基本概念和术语赋予确切的含义。数据(Data)是信息的载体,它能够被计算机识别、存储和加工处理。它是计算机程序加工的原料,应用程序处理各种各样的数据。计算机科学中,所谓数据就是计算机加工处理的对象,它可以是数值数据,也可以是非数值数据。数值数据是一些整数、实数或...
阅读全文
摘要:1.1数据结构的概念—有关概念和术语1.1数据结构的概念—数据结构课程的内容1.2抽象数据类型1.3算法和算法分析2.1线性表的逻辑结构2.2线性表的顺序存储及运算—顺序表2.2线性表的顺序存储及运算—顺序表上的基本运算2.2线性表的顺序存储及运算—顺序表应用举例2.3线性表的链式存储和运算—单链表...
阅读全文
摘要:C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。类型定义符typedef即可用来完成此功能。例如,有整型量a、b、其说明如下: int a,b;其中int是整型变量的类型说明符。int的完整写法为integer,为了增加程序的可读性,可把...
阅读全文
摘要:在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不...
阅读全文
摘要:在【例7-8】中采用了动态分配的办法为一个结构分配内存空间。每一次分配一块空间可用来存放一个学生的数据,我们可称之为一个结点。有多少个学生就应该申请分配多少块内存空间,也就是说要建立多少个结点。当然用结构数组也可以完成上述工作,但如果预先不能准确把握学生人数,也就无法确定数组大小。而且当学生留级、退...
阅读全文
摘要:在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。例如:int n;scanf("%d",&n);int a[n];用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无...
阅读全文
摘要:在ANSI C标准中允许用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传向形参的只是地址,从而减少了时间和空间的开销。【例11-7】计...
阅读全文
摘要:指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。设ps为指向结构数组的指针变量,则ps也指向该结构数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素。这与普通数组的情况是一致的。...
阅读全文
摘要:一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。结构指针变量说明的一般形式为: struct 结构名 *结构指针变量名例如,在前面的例题中定义了stu这个结构,如要说明一个...
阅读全文
摘要:数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下标结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。方法和结构变量相似,只需说明它为数组类型即可。例如:1 struct stu2 {3...
阅读全文
摘要:和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。【例11-2】对结构变量初始化。 1 main() 2 { 3 struct stu /*定义结构*/ 4 { 5 int num; 6 char *name; 7 ch...
阅读全文
摘要:结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。【例11-1】给结构变量赋值并输出其值。 1 main() 2 { 3 struct stu 4 { 5 int num; 6 char *name; 7 char sex;...
阅读全文
摘要:在程序中使用结构变量时,往往不把它作为一个整体来使用。在ANSI C中除了允许具有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算等都是通过结构变量的成员来实现的。表示结构变量成员的一般形式是: 结构变量名.成员名例如: boy1.num 即第一个人的学号 ...
阅读全文
摘要:说明结构变量有以下三种方法。以上面定义的stu为例来加以说明。1) 先定义结构,再说明结构变量。如:1 struct stu2 {3 int num;4 char name[20];5 char sex;6 float score;7 };8 struct stu b...
阅读全文
摘要:在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类...
阅读全文
摘要:1.C语言结构体的定义2.结构类型变量的说明3.结构变量成员的表示方法4.结构变量的赋值5.结构变量的初始化6.结构体数组的定义7.指向结构体变量的指针8.指向结构体数组的指针9.结构体指针变量作函数参数10.C语言动态存储分配11.C语言链表的概念12.C语言枚举类型13.C语言类型定义符type...
阅读全文
摘要:指针的数据类型:定义含义int i;定义整型变量iint *pp为指向整型数据的指针变量int a[n];定义整型数组a,它有n个元素int *p[n];定义指针数组p,它由n个指向整型数据的指针元素组成int (*p)[n];p为指向含n个元素的一维数组的指针变量int f();f为带回整型函数值...
阅读全文
摘要:前面介绍的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)C语...
阅读全文
摘要:如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。在前面已经介绍过,通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“单级间址”。而如果通过指向指针的指针变量来访问变量则构成“二级间址”。怎样定义一个指向指针型数据的指针变量呢?如下: char ...
阅读全文
摘要:一个数组的元素值为指针则是指针数组。指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。指针数组说明的一般形式为: 类型说明符 *数组名[数组长度]其中类型说明符为指针值所指向的变量的类型。例如: int *pa[3]表示pa是一个指针数组,...
阅读全文
摘要:前面我们介绍过,所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式为: 类型说明符 *函数名(形参表) { /*函数体*/ }其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指...
阅读全文
摘要:在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。函数指针变量定义的一般形式为: 类型说...
阅读全文
摘要:用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:1) 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由若干个数组元素组成的,它可用来存放整个字符串。...
阅读全文
摘要:在C语言中,可以用两种方法访问一个字符串。用字符数组存放一个字符串,然后输出该字符串。【例10-24】1 main()2 {3 char string[]=”I love China!”;4 printf("%s\n",string);5 }说明:和前面介绍的数组属性一样,strin...
阅读全文
摘要:本小节以二维数组为例介绍多维数组的指针变量。多维数组的地址设有整型二维数组a[3][4]如下:0 1 2 34 5 6 78 9 10 11它的定义为: int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}设数组a的首地址为1000,各下标变量的...
阅读全文
摘要:数组名可以作函数的实参和形参。如: 1 main() 2 { 3 int array[10]; 4 /* …… */ 5 /* …… */ 6 f(array,10); 7 /* …… */ 8 /* …… */ 9 }10 f(int arr[],i...
阅读全文
摘要:C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。引入指针变量后,就可以用两种方法来访问数组元素了。如果p的初值为&a[0],则:p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i个元素。*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a...
阅读全文
摘要:一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元的首地址。一个数组也是由各个数组元素(下标变量)组成的。每个数组元素按其...
阅读全文
摘要:指针运算符有两种:取地址运算符(&):取地址运算符(&)是单目运算符,其结合性为自右至左,其功能是取变量的地址。在scanf函数及前面介绍指针变量赋值中,我们已经了解并使用了&运算符。取内容运算符(*):取内容运算符(*)是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在*运算符之后跟...
阅读全文
摘要:函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。【例10-3】题目同【例10-2】,即输入的两个整数按大小顺序输出。今用函数处理,而且用指针类型的数据作函数参数。 1 swap(int *p1,int *p2) 2 { 3 int...
阅读全文
摘要:变量的指针就是变量的地址。存放变量地址的变量是指针变量。即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,例如,i_pointer代表指针变量,而*i...
阅读全文
摘要:在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编...
阅读全文
摘要:指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能像汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C...
阅读全文