这几天也没什么公司来招聘,自己打算把《数据结构》好好看看,顺便做下笔记。书早就买好了,看了一、二十页,一直丢在那,没去动它。
说一下书,是一本相当不错的书
《数据结构》--使用C语言
朱战立 编著 西安交通大学出版社 第3版
封面如下:
我看了看写得还是相当不错的。
呵呵!
今天遇到书课后的第一个问题,把例题用动态内存分配来做,代码写好后,编译有问题,运行结果是正常的,后来发现是动态内存分配的地址与我释放的地址不一样了,平常没用指针,现在问题出来了,先用了
int *a;
a=(int *) malloc(sizeof(int)*LENGTH);
分配了内存
后来在中间的程序中将a的值改变了,
再在后面来个free(a);
这样当然出问题了。
题目如下:例0--5
设计一个可以在数组中插入任意多个任意数据类型数据的函数,然后去设计一个函数在该数组中10个整型类型的数据。
代码如下:
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define MAXSIZE 50 #define LENGTH 10 typedef int DataType; typedef struct { DataType list[MAXSIZE]; int size; }SeqList;
/* 初始化一个SeqList结构体 */ void ListInit(SeqList *p) { p->size = 0; //初始元素的个数为0
}
/* 得到当前数组的长度 */ int GetLength(SeqList *p) { return p->size; }
/* 在数组的位置i前插入一个数据元素x,成功返回1,否则返回值为0 如一个10个元素的数组,i=5则表示要在a[6]前插入一个,即新的 a[5]值为x */ int ListInsert(SeqList *p,int i,DataType x) { int j; if(p->size >= MAXSIZE)//数组已满
{ printf("The arry is full\n"); return 0; } else if((i < 0) || (i > p->size))//i超出当前数组值的范围
{ printf("error!\n"); return 0; } else { for(j=p->size;j > i;j--) p->list[j]=p->list[j-1]; p->list[i]=x; //插入
p->size++; return 1; } }
/* 将数组中的第i元素(a[i])取出来,存到x中,但不删除,成功返回1,否则返回0 */ int ListGet(SeqList *p,int i,DataType *x) { if(i<0 || i>p->size)//i超出范围
{ printf("error!\n"); return 0; } else { *x=p->list[i]; return 1; } }
/* 主函数 */ void main(void) { SeqList testList; int i,x; int *a; if((a=(int *) malloc(sizeof(int)*LENGTH))==NULL) { printf("no ram to allocation\n"); exit(1); } printf("The number will be inserted is\n"); for(i=0;i<LENGTH;i++)//将数组a初始化
{ *(a+i)=i; printf("%d\t",*(a+i)); } printf("\n"); ListInit(&testList); for(i=0;i<LENGTH;i++)//插入10个元素
{ if(ListInsert(&testList,i,*(a+i))==0) { printf("error!\n"); return; } } printf("The SeqList size is %d .\n",GetLength(&testList)); printf("The numbers get is :\n "); for(i=0;i<10;i++) { if(ListGet(&testList,i,&x)==0) { printf("error!\n"); return; } else printf("%d\t",x); } printf("\n"); free(a); }
|
以后一定要记住,利用malloc函数分配内存后:
1、因为malloc函数的返回值是void*型,这样设计的好处是为了满足不同类型的数据来用它来分配内存,所以在用的时候一定先进行子针类型转换
如:(int *) malloc(sizeof(int)*LENGTH)中的int *这样就转换成整型了。
2、分配后的指针变量的值(也让是地址值)最好不要改变其本身的值,要不在后面释放时直接用free()函数释放时导致两者的地址不一样,
如:int *a;
a=(int *) malloc(sizeof(int)*LENGTH)
a++;
free(a);
这样a的值变了,free(a)中就与刚开始分配时就不一样了。
要改成free(a-1);这样在VC中运行就没问题了,
这样在程序短时还能很明显看出来,要是程序长了,说不定在哪改了a的值就不知道了,
所以在中间段程序中,最好不要对a的值进行操作,若想要对其地址所指的内容的值进行改变,可以使用*(a+i)=10;这样的语句.
今天的错误就犯在这了,先记下,以防再犯.
再补充一些数据结构当中的概念,书上的,基本上都理解了:
1、什么是数据?
数据是人们利用文字符号、数字符号以及其它规定的符号对现实世界的事物及其活动所作的抽象的描述。
2、什么是数据元素?
表示一个事物的一组数据称作一个数据元素。
比如描述一个人的大致外形情况,有人用这种数据(174cm、68kg、70cm),当然描述的侧重性不同,对客观事物的数据也就不同。到底这种数据元素是什么意思?这就与数据项联系起来了。
数据项:构成数据元素的数据称作该数据元素的数据项。
假如上面的(174cm、68kg、70cm)代表的是身高、体重、腰围的话,则身高是一个数据项,体重也是一个数据项,腰围也是一个数据项,(174cm、68kg、70cm)这组数据则是一个数据元素了。
3、抽象数据元素与抽象数据元素类型
抽象数据元素:没有实际含义的数据元素称作抽象数据元素。也就是说他们是抽象出来的,不对应于客观事物的具体属性。
抽象数据元素类型:没有确切定义的数据类型。(??什么又是数据类型?后面解释)
4、数据的逻辑结构
数据的逻辑结构:数据元素之间的相互联系方式。
一般来说,数据元素之间的相互联系的方式有三种:
线性结构、树结构、图结构
它们也是从简单向复杂。利用这些关系,可以构建成更为复杂的逻辑关系。
5、类型、数据类型、抽象数据类型
类型是一组值的集合。如整数类型,字符类型等
数据类型:指一个类型和定义在这个类型上的操作集合。
如整数数据类型,通常也简称为整型,这时既包括它的取值范围(-32767~32768 不同编译系统可能不一样),同时也包括它的作的集合,如加减乘除。
抽象数据类型:(Abstract Data Type)即提供一个逻辑概念上的类型和这个类型上的操作的集合。
从定义看,数据类型和抽象数据类型的定义大致是相同的。通常所说数据类型,指的是程序设计语言所支持的基本数据类型,而ADT所指的是程序设计人员通过基本数据类型再构造出的基他的较复杂的数据类型。如堆栈,队列,串,树等。当然也可以是其它的,C++就是这样扩展而来的,将扩展到类,如人,人就是一个类,而李明这个实实在在的人,则是人的一个对象,
有书上说类之于对象就像整型之于整型变量,就是这个道理。
6、算法
算法其实应该是个数学问题,也就是说问题给定,用来解决这个问题的操作步骤的集合。
阅读(1456) | 评论(0) | 转发(0) |